Linux sed命令總結
sed是Linux中處理文字最重要的兩個工具之一,能夠極大簡化需要進行的資料處理任務。
sed被稱為流編輯器(stream editor),可以根據命令來處理資料流中的資料。這些命令要麼從命令列中輸入,要麼儲存在一個命令文字檔案中。sed會執行一下操作:
(1)一次從輸入中讀取一行資料
(2)根據所提供的編輯器命令匹配資料
(3)按照命令修改流中的資料
(4)將新的資料輸出到STDOUT
在流編輯器將所有命令與一行資料匹配完畢後,它會讀取下一行資料並重復這個過程。在流編輯器處理完流中所有的資料行之後,它就會終止。
sed命令的格式為:
sed options script file
options中常用的選項如下所示:
- -e command 將command中的命令新增到已有的命令中,也就是說當sed中使用多個命令時要使用這個選項。
- -f file 將file中制定的命令新增到已有的命令中,注意每一個命令都要在獨立的一行裡。
- -i 直接修改原始檔。
- -n 通常情況下,當所有命令執行完後輸出會顯示在STDOUT中,-n選項會禁止輸出。通常和替換標記p一起使用,只輸出被修改過的行。
script中的常用使用方式:
1. 替換文字中的指定字元,形式為:
sed 's/pattern/replacement/flags'
主要用法有(注意:如果不加上-i選項,修改的都是流中的內容,file本身的內容沒有變化):
- sed 's/pattern/replacement/' file 將file的流中每行的第一個pattern替換成replacement
- sed 's/pattern/replacement/g' file 將file的流中每行的每一個pattern替換成replacement
- sed 's/pattern/replacement/2
' file 將file的流中每行的第二個pattern替換成replacement- sed -n 's/pattern/replacement/p' file 將file的流中每行的第一個pattern替換成replacement,並打印出修改過的行
- sed -n 's/pattern/replacement/2p' file 將file的流中每行的第二個pattern替換成replacement,並打印出修改過的行(標記符號可以多個一起使用,且順序不影響結果)
- sed 's/pattern/replacement/gw outFile' file 將file的流中每行的每一個pattern替換成replacement,並將輸出儲存到outFile中(w標記必須要放在最後,如果寫作wg,標記g將無效,並生成名為g outFile的輸出檔案)
- sed '2s/pattern/replacement/' file 將file的流中第二行的第一個pattern替換成replacement
- sed '2,4s/pattern/replacement/' file 將file的流中第二行到第四行的第一個pattern替換成replacement
- sed '2,$s/pattern/replacement/' file 將file的流中第二行到最後一行的第一個pattern替換成replacement
- sed '/word/s/pattern/replacement/' file 將file的流中含有word的行中的第一個pattern替換成replacement,可以使用正則表示式
2. 刪除文字
- sed 'd' file 將file的流中所有行全部刪除
- sed '2d' file 將file的流中的第二行刪除
- sed '2,4d' file 將file的流中的第二行到第四行刪除
- sed '2,$d' file 將file的流中的第二行到最後一行刪除
- sed '/word/d' file 將file的流中含有word的行刪除
3. 插入和附加文字
(1)插入(insert)命令(i)會在指定行前增加一個新行。
(2)附加(append)命令(a)會在指定行後增加一個新行。
格式為:
sed '[address]command\new line'
主要用法為($和匹配模式/word/都可以使用):
- sed '3i\This a an inserted line.' file 將一個新行插入到file的流的第三行前
- sed '3a\This a an inserted line.' file 將一個新行插入到file的流的第三行後
4. 修改行($和匹配模式/word/都可以使用):
- 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. 寫入檔案
- sed 'w outFile' file 將file的內容寫入到outFile中
- sed '1,2w outFile' file 將file第一行到第二行的內容寫入到outFile中
8. 從檔案讀取資料($和匹配模式/word/都可以使用):
- sed '3r newFile' file 將newFile的內容新增到file的流的第三行之後
參考文獻:Linux命令列與shell指令碼程式設計大全(第三版)