天天看點

sed指令基礎及進階用法

sed工具:sed是文本流編輯器,逐行對檔案的内容進行處理

用法:sed [option] ... 'script' inputfile...

選項:

  -n:靜默模式,不輸出模式空間的内容至螢幕

  -e:實作多點的功能編輯

  -f /path/from/script_file:從指定的檔案讀取編輯腳本

  -r:支援使用擴充的正規表達式

位址界面方法:

  (1)不給位址:對全文進行處理

  (2)一個位址(單位址)

    #:指定的行

    /pattern/:被引用處模式所能夠比對到的每一行:

  (3)位址範圍   

    #,#:從第幾行到第幾行

    #,+#:顯示從第幾行開始向後的N行

    /pat1/,/pat2/:同時比對2個參數,表示比對這2個參數之間的所有行

    #,/pat1/:表示比對這2個參數之間的所有行

  (4)~:步進

         #sed -n ‘1~2p’ test.txt(第一行開始,每次增加2行,意思就是顯示奇數行)

   #sed -n ‘2~2p’ test.txt(從第二行開始顯示,每次增加2行,意思就是顯示偶數行)

編輯指令:

  d:删除被位址界定標明的内容

  p:顯示(列印)模式空間中的内容到螢幕上,隻列印符合條件的行,常于-n結合一起使用

  a \text:在行後面一行追加文本:支援使用\n實作多行追加;

    例: #sed '/^T/a \abc' a.txt

  i \text:在行前面一行追加文本:支援使用\n實作多行追加;

    例:# sed '/^T/i \abc' a.txt

  c \text:替換比對到的行:

    例:# sed '/^T/c \abc' a.txt

  w /path/to/somefile:儲存模式空間中比對到的内容至指定檔案中;

  r /path/from/somefile:讀取指定檔案的文本遊戲 至模式空間中比對到的行後;

  =:為模式空間中的行,列印行号;

    例:#sed -n '/^T/=' a.txt

  q:一旦比對到内容,則退出;不再往下比對

  !:取反條件;對除了模式比對到的行以外的行,進行操作;

  s///:支援使用其它分隔符,s@@@,s###

替換标記:

  #:行内替換,替換第幾次出現的比對的内容,例:sed -n 's/Unix/UNIX/2p' a.txt,把第2次出現的Unix替換

  p:如果替換成功,則顯示替換成功的行,與-n一起使用

  w /path/to/somefile:将替換成功的行儲存至指定檔案中

練習1:删除/boot/grub/grub.conf檔案中所有以空白開頭的行行首的空白字元

  #sed 's@^[[:space:]]\+@@' /boot/grub/grub.conf                  

練習2:删除/etc/fstab檔案中所有以#開頭,後面至少跟一個空白字元的行的行首的#和空白字元

  #sed 's@^#[[:space:]]\+@@' /etc/fstab 

練習3:echo一個絕對路徑給sed指令,取出其基名:        

  #echo "/etc/sysconfig" | sed 's@[^/]\+$@@'

練習4:批量修改檔案名字

  #ls *.jpg | sed 's#\(.*\)_finished\(.*\).*#mv & \1\2#g' | bash

進階編輯指令:

  h:把模式空間中的内容覆寫至保持空間中;

  H:把模式空間的内容追加至保持空間中;

  g:從保持空間取出資料覆寫至模式空間;

  G:從保持空間取出資料追加至模式空間;

  x:把模式空間中内容與保持空間中的内容進行互換操作;

  n:讀取比對到的行的下一行覆寫至模式空間;

  N:讀取比對到的行的下一行追加至模式空間;

  d:删除模式空間中的所有行;

  D:删除多行模式空間中的第一行;

  示例用法:

  #sed -n ‘n;p’ test.txt(輸出偶數行)

  #sed ‘n;d’ test.txt(隻顯示奇數行)

       #sed ‘$!d’ test.txt(最出檔案最後一行)

  #sed ‘G’ test.txt(在每一行下面加一個空白行)

  #sed ‘/^$/d;G’ test.txt(每行間隻保留一個空白行)

  #sed '1!G;h;$!d' test.txt(逆行顯示檔案内容)

  #sed ‘$!N;$!D’ test.txt(讀檔案的後2行)

  #sed -n ‘1!G;h;$p’ test.txt(逆行顯示檔案内容)

保持空間使用的一個例子:

  需求:把單詞the和statement之間的單詞的全部改為大寫

  原文:

   find the Match statement

   consult the Get statement 

   using the Read statement to retrieve data

  sed寫法:

       /the .*statement/{

        h

        s/.*the \(.*\)statement.*/\1/

        y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

        G

        s/\(.*\)\n\(.*the \).*\( statement.*\)/\2\1\3/

        }

  結果:     

    find the MATCH  statement

  Consult the GET  statement

  using the READ  statement to retrieve data

  解析:

   /the .*statement/:比對這種模式的行,然後進行修改

   h:将比對到的内容覆寫至保持空間,保留一份複本

   s/.*the \(.*\)statement.*/\1/:在模式空間中将比對到行轉換為要改變的單詞

   y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/:将修改後的單詞轉換為大寫

   G:把保持空間的複本追加到模式空間

   s/\(.*\)\n\(.*the \).*\( statement.*\)/\2\1\3/:将修改為大寫的單詞替換到原語句中的單詞

從這個腳本可以看出,靈活的使用保持空間對于隔離和操作輸入行的某部分内容很有用

本文轉自激情燃燒的歲月部落格51CTO部落格,原文連結http://blog.51cto.com/liuzhengwei521/1883236如需轉載請自行聯系原作者

weilovepan520

繼續閱讀