本文章參考《Linux大棚命令百篇》拧略,推薦買著看诅愚,很好的一本書。
sed (stream editor)被稱之為流編輯器拴测。
sed命令是針對于行處理的工具乓旗,對每一行進行處理,并將處理的結(jié)果輸出到標準輸出昼扛。
sed的命令格式:
sed command file
command部分:針對每行的內(nèi)容要進行的處理
file部分:要處理的文件寸齐,如果忽略file參數(shù),則sed會把標準輸入作為處理對象抄谐。
sed的工作原理:
sed會一次處理一行內(nèi)容渺鹦。處理時,把當前處理的行存儲在臨時緩沖區(qū)中蛹含,稱為“模式空間”(pattern space)毅厚,接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后浦箱,把緩沖區(qū)的內(nèi)容送往屏幕吸耿。接著處理下一行,這樣不斷重復酷窥,直到文件末尾咽安。文件內(nèi)容并沒有改變,除非你使用重定向存儲輸出
一個簡單的栗子:
# cat example.txt
test 1
test2
testtest
XtestX
BBtest
# sed '/2/d' example.txt
test 1
testtest
XtestX
BBtest
這個栗子是刪除文件中包含字符"2"的行蓬推。命令要用單引號括起來妆棒!
/2/d中的d表示刪除,意思就是說只要某行含有字符2沸伏,則刪除之糕珊。
想實現(xiàn)類似于cut -d : -f 1 /etc/passwd的效果,用sed怎么做呢毅糟?
# head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# head -n 5 /etc/passwd | sed 's/:.*$//'
root
bin
daemon
adm
lp
一些命令
sed會將模式空間里的行經(jīng)過處理后輸出到標準輸出红选,這是默認的處理方式。就是說姆另,除非你使用d命令來刪除此行喇肋,否則它無論變成什么樣子坟乾,無論它被替換成什么形狀,它都會多多少少被輸出到屏幕上蝶防。
-n選項一般會和-p配合使用糊渊,意思是輸出那些匹配到的行。
# cat example.txt
test 1
test2
testtest
XtestX
BBtest
# sed -n '/test2/p' example.txt
test2
sed的command部分可以分為兩塊:一塊是范圍設定慧脱,一塊是動作處理渺绒。
范圍設定可以采用兩種不同的方式來表達:
- 指定行數(shù):比如'3,5',表示第3行菱鸥,4行宗兼,5行;而'5,$'表示第5行至文件最后一行氮采。
- 匹配模式:例如/[dD]/表示匹配行首不是以d或D開頭的行等等殷绍。
動作部分:
d:表示刪除行
p:打印該行
r:讀取指定文件的內(nèi)容
w:寫入指定文件
a:在下面插入新行新內(nèi)容
看一下例子吧:
顯示文件的第10到20行:
# sed -n '10,20p' example.txt
vfinj
VBFNJ
VFEANKM
VREF
VERFD
VF
BTERS F
3RQEVAF
BQTAW SV
Qreafd
qVWAD
將所有以V或v開頭的行的所有小寫n變?yōu)榇髮慛
# sed '/^[vv]/s/n/N/g' example.txt
我們在command命令部分采用 /AA/s/BB/CC/g 的語法,這表示我們要匹配到文件中帶有AA的行鹊漠,并且將這些行中的BB替換成CC主到。
刪除每行最后兩個字符:
# sed 's/..$//' example.txt
刪除每一行的前兩個字符:
# sed ‘s/..//’ test
&符號的妙用:
&表示“被匹配的部分”
# cat mysed.txt
Beijing
London
# sed 's/Bei/&2008/' mysed.txt
Bei2008jing
London
更好的定位方法:
# cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007
# sed -n '/2005/,/2007/p' mysed.txt
Beijing 2005
Beijing 2006
Beijing 2007
我們使用/2005/來匹配行范圍的首行,用/2008/來匹配行范圍的最尾行躯概〉窃浚可以看到,在匹配尾行時娶靡,只要遇到符合要求的行牧牢,即停止,不會再繼續(xù)向后匹配了姿锭。(只是匹配到第一個2007塔鳍,并沒有匹配到第二個2007)
使用-e選項來設置多個command:
當包含超過一個的command的時候,必須在每個command前面加上選項-e
# sed -n -e '1,2p' -e '4p' mysed.txt
Beijing 2003
Beijing 2004
Beijing 2006
注意:-e后面必須立即接command呻此,不允許再夾雜其他的選項
使用 -f指定command文件:
如果你的command很長轮纫,那么可以將其寫在文件里,然后使用-f來設定這個文件作為command部分:
# cat callsed
/2004/,/2006/p
# sed -n -f callsed mysed.txt
Beijing 2004
Beijing 2005
Beijing 2006
插入和控制
在多個command之間焚鲜,是按照在命令中的先后順序來執(zhí)行的掌唾。
插入內(nèi)容:
將要插入的內(nèi)容保存到一個單獨的文件
$ cat ins.txt
====China====
使用r 實現(xiàn)插入
sed ‘/2005/r ins.txt’ mysed.txt
除了可以通過指定文件來插入外,還可以使用 'a'在特定行的下面插入特定內(nèi)容:
# sed '/2004/a\china' mysed.txt
Beijing 2003
Beijing 2004
china
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007
還可以使用 '\i'在指定行的上面添加內(nèi)容:
# sed '/2004/i\china' mysed.txt
Beijing 2003
china
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007
y動作:
y就是按照字符順序恃泪,實現(xiàn)前后的替換
# sed 'y/ei/ie/' mysed.txt
Biejeng 2003
Biejeng 2004
Biejeng 2005
Biejeng 2006
Biejeng 2007
Biejeng 2008
Biejeng 2007
y的語法格式: y/source/dest/
如果source中出現(xiàn)了重復的字符郑兴,則只有第一次對應的替換會產(chǎn)生效果犀斋,后面的不會起作用贝乎。
原文
# cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007
在iji到iba的替換中,只有j到b起到了作用
# sed 'y/iji/iba/' mysed.txt
Beibing 2003
Beibing 2004
Beibing 2005
Beibing 2006
Beibing 2007
Beibing 2008
Beibing 2007
對匹配行的下一行進行處理:
# sed '/2004/{n;y/eijing/EIJING/;}' mysed.txt
Beijing 2003
Beijing 2004
BEIJING 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007
這個例子就是找含有2004的行叽粹,然后將它下面的一行中的eijng替換為大寫的EIJNG览效。這里面的“n;”起到了“移至下一行”的作用却舀。n背后的含義其實是將下一行放到模式空間中去。
將指定行寫入到指定文件中:
w動作會將匹配到的內(nèi)容保存到另一個文件中:
# sed '/200[4-6]/w new.txt' mysed.txt
# cat new.txt
Beijing 2004
Beijing 2005
Beijing 2006
如果想在原文件中進行操作锤灿,需要加 -i 選項挽拔。