天天看點

Sed

Sed    Stream Editor    

      行編輯器(全屏編輯器:vi)

      逐行讀取到模式空間,處理完之後輸出   預設不修改源檔案,

      僅對模式空間中的資料做處理,處理完之後将模式空間的内容追行列印

      sed 'Address Command' file...   ‘’ “” 都可以,如果有變量用弱引用

      Address

           1、StartLine,EndLine

               1,100

               $       最後一行

               $-1     倒數第二行

           2、/RegExp/

               /^root/ '/oot/d'

           3、/pattern1/,/pattern2/

               第一次被pattern1比對到的行開始,至第一次被pattern2比對到的行結束

           4、LineNumber

               指定的行

           5、StartLine, +N

               從startLine開始,向後的N行

       Command

               -i  直接修改源檔案

               -n  靜默模式,不再顯示模式空間中内容  

               -e  SCRIPT -e SCRIPT    可以同時執行多個腳本(COMMAND)

                   sed  --e '1,10d' -e 's/L\(..e\)r/l\1/g' /shell/1

               -f  用腳本處理/PATH/TO/SED_SCRIPT

                   vi /shell/script

                       2a\two numbers

                       4s/#/@/g

                       $i\end numbers

                   sed -f /shell/script /shell/1

               -r  适用擴充正規表達式

                   錯誤的寫法   history  | sed -r 's/^[[:space:]]\(.*\)/\1/'

               d   删除行

                   sed '1d'    删除第一行

                   sed '3,$d' /tmp/inittab 删除第三行到最後一行

                   sed '1,+2d' /tmp/inittab    删除第一行到第三行

                   sed '/^\//d' /etc/fstab     删除以\開頭的行

               p   顯示比對到的行

                   sed '/^\//p' /etc/fstab     比對到的顯示2次,因為sed預設會顯示模式空間的行

                   sed -n '/^\//p' /etc/fstab

               a   \string 在比對到的行後面,追加新行,内容為"string"   a後面加\利于實作特殊字元

                   sed  '/^\//a\# hello world \n#hello linux' /etc/fstab   在\開頭行後加2行注釋

                   sed  '/^\//a#hello\n#hello' /etc/fstab          a

               i   \string 在比對到的行前面,追加新行,内容為"string"

               r   file    将制定檔案内容添加至符合條件的行後

                   sed '2r /etc/inittab' /shell/1

                   sed '1,2r /etc/inittab' /shell/1    第一行後面添加一遍,第二行後面添加一遍

               w   将指定範圍内的内容另存至指定的檔案中,如果是已存在檔案會覆寫其内容,如果不存在會建立檔案并儲存内容

                    sed  -n '/^#/w /shell/2' /etc/inittab

               s   /pattern/string/    查的并替換   預設開始隻替換每行的第一個

                   sed '1,3s/#/$/' /shell/1

                   sed 's/^\//#/' 2                    替換以/開頭的行為#

                   sed '1s/#/$/;3s/#/$/' /shell/1      替換第一行第三行第一個比對到的

                   修飾符

               g   全部替換

                   sed '1s/#/$/g;3s/#/$/' /shell/1     替換第一行全部和第二行第一個比對到的

                   i   比對時忽略大小寫

                    sed 's/inittab/haha/ig' /shell/1   替換全文inittab時忽略大小寫,替換為haha

               s   /正規表達式/字元串(    支援引用,不支援正則)/ s$$$ s@@@ s%%%  這樣不适用查找中帶有的,平時适用/,這樣查找/是就不用轉義了

                   後向引用    \(\)    \1  \2

                   l..e    like --> liker  love -->lover 兩種實作 \(\)   &

                       sed 's/\(l..e\)/\1r/' /shell/1

               &   引用模式比對整個串

                       sed 's/l..e/&r/' /shell/1

                   隻引用一部分的時候,後項引用可以細化第一個pattern,&則是全部比對,

                       實作like --> Liker  love -->Lover

                       sed 's/l\(..e\)/L\1r/g' /shell/1

                   現實删除history前面的空白字元

                       history  | sed -r 's/^[[:space:]]*//g'

練習  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<code>1、删除</code><code>/etc/grub</code><code>.conf檔案中行首的空白字元</code>

<code>    </code><code>sed</code> <code>'s/^[[:space:]]*//'</code> <code>/etc/grub</code><code>.conf</code>

<code>2、替換</code><code>/etc/inittab</code><code>檔案中“</code><code>id</code><code>:5:initdefault:"一行中的數字為3;</code>

<code>    </code><code>sed</code> <code>'s/^\(id\):5:\(initdefault\)/\1:3:\2/'</code> <code>/etc/inittab</code>

<code>3、删除</code><code>/etc/inittab</code><code>檔案中的空白行</code>

<code>    </code><code>sed</code> <code>'/^$/d'</code> <code>/etc/inittab</code>

<code>4、删除</code><code>/etc/inittab</code><code>檔案中開頭的</code><code>#号,但要求#号後面必須有空白字元</code>

<code>    </code><code>sed</code> <code>'s/^#\([[:space:]]\+\)/\1/'</code> <code>/shell/inittab</code>

<code>5、删除</code><code>/etc/inittab</code><code>檔案中開頭的</code><code>#号和空白字元,但要求#号後面必須有空白字元</code>

<code>    </code><code>ed -r </code><code>'s/^#[[:space:]]+//'</code> <code>/shell/inittab</code>

<code>    </code><code>sed</code>  <code>'s/^#\([[:space:]]\+\)//'</code> <code>/shell/inittab</code>

<code>6、取出一個檔案路徑的目錄名稱</code>

<code>    </code><code>echo</code> <code>"/shell/asdasd/inittab"</code> <code>| </code><code>sed</code> <code>'s/^\(.*\)\/.*$/\1/'</code>

<code>    </code><code>echo</code> <code>"/shell/haha/inittab"</code> <code>| </code><code>sed</code> <code>'s#^\(/.*\)/.*#\1#'</code>

<code>    </code><code>echo</code> <code>"/shell/haha/inittab/"</code> <code>| </code><code>sed</code> <code>-r </code><code>'s#^(/.*/)[^/]+/?#\1#'</code>

<code>7、取得路徑基名</code>

<code>    </code><code>echo</code> <code>"/shell/haha/inittab/"</code> <code>| </code><code>sed</code> <code>-r </code><code>'s#^/.*/([^/]+)/?#\1#'</code>

<code>8、删除某檔案中以空白字元後面跟</code><code>#類的行中的開頭的空白字元及其#</code>

<code>    </code><code>sed</code> <code>'s/^[[:space:]]#\(.*\)/\1/'</code> <code>/shell/inittab</code>

本文轉自 ftmoonfans  51CTO部落格,原文連結:http://blog.51cto.com/soulboy/1259038

繼續閱讀