指令格式
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.