天天看點

sed應用詳解指令格式指令詳解原地編輯

指令格式

sed的全稱是"stream editor",即流編輯器。

先來看一個簡單的例子及其輸出結果。

echo "Hello World" | sed 's/Hello/hello/'
           
hello World
           

很明顯,上面的例子中,sed所做的事情就是從标準輸入中讀取字元串"Hello World",将其中的Hello替換為hello,并将結果輸出。's/Hello/hello'稱為sed中的指令(command),它是一個替換指令。一般地,sed的使用指令格式如下:

sed 'command' [file ...]
           

如果不指定處理檔案,則sed預設從标準輸入讀取。sed也允許指定多個處理指令,使用-e參數指定,格式如下:

sed -e 'command' -e 'command' [file ...]
           

sed的強大之處就在于其中的'command'支援豐富的功能和靈活的擴充。

指令詳解

sed指令'command'的基本形式如下:

[位址範圍]指令[參數]
           

其中位址範圍其實就是行範圍,它是可選的。如果不指定則對所有行生效。如果指定,可以指定某一行,也可以指定從起始行到結束行的一個範圍。特殊字元'$'表示最後一行。特殊字元"!"則對範圍取反。總結以下,位址範圍的形式如下:

[行号,[行号]][!]
           

下面通過幾個例子來示範位址範圍的用法。

建立文本檔案test.txt,内容如下。

Line 1.
Line 2.
Line 3.
Line 4.
Line 5.
           

把第三行的Line替換為line:

sed '3s/Line/line/' test.txt
           
Line 1.
Line 2.
line 3.
Line 4.
Line 5.
           

把最後一行的Line替換為line:

sed '$s/Line/line/' test.txt
           
Line 1.
Line 2.
Line 3.
Line 4.
line 5.
           

把第三行到最後一行的Line替換為line:

sed '3,$s/Line/line/' test.txt
           
Line 1.
Line 2.
line 3.
line 4.
line 5.
           

把除了第三行到最後一行外的其他所有行中的Line替換為line:

sed '3,$!s/Line/line/' test.txt
           
line 1.
line 2.
Line 3.
Line 4.
Line 5.
           

上述例子中的's'就是一個編輯指令,表示文本替換。sed,還支援其它的一些編輯指令。如果用過編輯器vi,就會發現這些編輯指令其實跟vi中的編輯指令基本一樣。比如,vi中在指令模式下的替換指令如下,很容易發現:後面的部分跟sed裡的替換指令完全一樣!

:3s/Line/line/
           

以下列出一些常見的sed指令。

指令 說明
[N]a\ 在某行之後添加文本
[N]i\ 在某行之前插入文本
[N1[,N2]]c\ 将指定範圍替換為\後面的文本
[N1[,N2]]d 删除指定範圍
[N1[,N2]]s/regular expression/replacement/flags 在指定範圍内比對正規表達式,并将比對到的替換為replacement指定的文本
[N1[,N2]]y/string1/string2/ 在指定範圍内,将string1中的字元分别替換為string2的對應的字元

下面仍以前面的test.txt檔案為例,示範這些指令的用法。

Line 1.
Line 2.
Line 3.
Line 4.
Line 5.
           

在第三行後面添加新的一行:

sed '3a\Line appended.' test.txt
           
Line 1.
Line 2.
Line 3.
Line appended.
Line 4.
Line 5.
           

在第三行之前插入新的一行:

sed '3i\Line inserted.' test.txt
           
Line 1.
Line 2.
Line inserted.
Line 3.
Line 4.
Line 5.
           

替換第一和第二行:

sed '1,2c\Lines changed.' test.txt
           
Lines changed.
Line 3.
Line 4.
Line 5.
           

删除最後一行:

sed '$d' test.txt
           
Line 1.
Line 2.
Line 3.
Line 4.
           

将文本檔案中的"Line #"中的數字分别加1,即Line 1變為Line 2,Line 2變為Line 3,以此類推:

sed 'y/12345/23456/' test.txt
           
Line 2.
Line 3.
Line 4.
Line 5.
Line 6.
           

原地編輯

如果帶上-i選項,則sed會直接編輯源檔案,而不是将結果輸出到标準輸出。需要注意的是,-i選項不能用于标準輸入。

下面的例子仍以之前的test.txt為例:

sed -i 's/ [1-5]//' test.txt
           
cat test.txt
Line.
Line.
Line.
Line.
Line.
           

繼續閱讀