1. 程式人生 > >Linux sed命令總結

Linux sed命令總結

sed是Linux中處理文字最重要的兩個工具之一,能夠極大簡化需要進行的資料處理任務。

sed被稱為流編輯器(stream editor),可以根據命令來處理資料流中的資料。這些命令要麼從命令列中輸入,要麼儲存在一個命令文字檔案中。sed會執行一下操作:

(1)一次從輸入中讀取一行資料

(2)根據所提供的編輯器命令匹配資料

(3)按照命令修改流中的資料

(4)將新的資料輸出到STDOUT

在流編輯器將所有命令與一行資料匹配完畢後,它會讀取下一行資料並重復這個過程。在流編輯器處理完流中所有的資料行之後,它就會終止。

sed命令的格式為:

sed options script file

options中常用的選項如下所示:

  1.  -e command   將command中的命令新增到已有的命令中,也就是說當sed中使用多個命令時要使用這個選項。
  2.  -f file  將file中制定的命令新增到已有的命令中,注意每一個命令都要在獨立的一行裡。
  3.  -i  直接修改原始檔。
  4.  -n 通常情況下,當所有命令執行完後輸出會顯示在STDOUT中,-n選項會禁止輸出。通常和替換標記p一起使用,只輸出被修改過的行。

script中的常用使用方式:

1. 替換文字中的指定字元,形式為:

sed 's/pattern/replacement/flags'

主要用法有(注意:如果不加上-i選項,修改的都是流中的內容,file本身的內容沒有變化):

  1. sed 's/pattern/replacement/' file   將file的流中每行的第一個pattern替換成replacement
  2. sed 's/pattern/replacement/g' file    將file的流中每行的每一個pattern替換成replacement
  3. sed 's/pattern/replacement/2
    ' file    將file的流中每行的第二個pattern替換成replacement
  4. sed -n 's/pattern/replacement/p' file   將file的流中每行的第一個pattern替換成replacement,並打印出修改過的行
  5. sed -n 's/pattern/replacement/2p' file   將file的流中每行的第二個pattern替換成replacement,並打印出修改過的行(標記符號可以多個一起使用,且順序不影響結果)
  6. sed 's/pattern/replacement/gw outFile' file   將file的流中每行的每一個pattern替換成replacement,並將輸出儲存到outFile中(w標記必須要放在最後,如果寫作wg,標記g將無效,並生成名為g outFile的輸出檔案)
  7. sed '2s/pattern/replacement/' file   將file的流中第二行的第一個pattern替換成replacement
  8. sed '2,4s/pattern/replacement/' file   將file的流中第二行到第四行的第一個pattern替換成replacement
  9. sed '2,$s/pattern/replacement/' file   將file的流中第二行到最後一行的第一個pattern替換成replacement
  10. sed '/word/s/pattern/replacement/' file   將file的流中含有word的行中的第一個pattern替換成replacement,可以使用正則表示式

2. 刪除文字

  1. sed 'd' file   將file的流中所有行全部刪除
  2. sed '2d' file   將file的流中的第二行刪除
  3. sed '2,4d' file   將file的流中的第二行到第四行刪除
  4. sed '2,$d' file   將file的流中的第二行到最後一行刪除
  5. sed '/word/d' file   將file的流中含有word的行刪除

3. 插入和附加文字

(1)插入(insert)命令(i)會在指定行前增加一個新行。

(2)附加(append)命令(a)會在指定行後增加一個新行。

格式為:

sed '[address]command\new line'

主要用法為($和匹配模式/word/都可以使用):

  1. sed '3i\This a an inserted line.' file   將一個新行插入到file的流的第三行前
  2. sed '3a\This a an inserted line.' file   將一個新行插入到file的流的第三行後

4. 修改行($和匹配模式/word/都可以使用):

  1. sed '3c\This is a changed line.' file   將file的流的第三行修改為This is a changed line.

5. 轉換命令

轉換(transform)命令(y)是唯一可以處理單個字元的sed命令,格式如下:

sed '[address]y/inchars/outchars'

轉換命令會對inchars和outchars做一對一對映,inchars的第一個字元會被轉換為outchars的第一個字元,inchars的第二個字元會被轉換為outchars的第二個字元。如果inchars和outchars的長度不同,sed編輯器會產生一條錯誤訊息:

sed: 1: "y/abc/de/": transform strings are not the same length

舉例如下:

$ echo "1 2 3 1 2 3 2 3 4 5 6" | sed 'y/123/456/'

4 5 6 4 5 6 5 6 4 5 6

可以看出,轉換命令是一個全域性命令,會在文字行中找到的所有指定字元進行轉換,無法限定只轉換在特定地方出現的字元

7. 寫入檔案

  1. sed 'w outFile' file   將file的內容寫入到outFile中
  2. sed '1,2w outFile' file   將file第一行到第二行的內容寫入到outFile中

8. 從檔案讀取資料($和匹配模式/word/都可以使用):

  1. sed '3r newFile' file   將newFile的內容新增到file的流的第三行之後

 

參考文獻:Linux命令列與shell指令碼程式設計大全(第三版)