sed的流藝術(shù)

本文章參考《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 選項挽拔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市但校,隨后出現(xiàn)的幾起案子螃诅,更是在濱河造成了極大的恐慌,老刑警劉巖状囱,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件术裸,死亡現(xiàn)場離奇詭異,居然都是意外死亡亭枷,警方通過查閱死者的電腦和手機袭艺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叨粘,“玉大人猾编,你說我怎么就攤上這事∩茫” “怎么了答倡?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驴党。 經(jīng)常有香客問我苇羡,道長,這世上最難降的妖魔是什么鼻弧? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任设江,我火速辦了婚禮,結(jié)果婚禮上攘轩,老公的妹妹穿的比我還像新娘叉存。我一直安慰自己,他們只是感情好度帮,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布歼捏。 她就那樣靜靜地躺著,像睡著了一般笨篷。 火紅的嫁衣襯著肌膚如雪瞳秽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天率翅,我揣著相機與錄音练俐,去河邊找鬼。 笑死冕臭,一個胖子當著我的面吹牛腺晾,可吹牛的內(nèi)容都是我干的燕锥。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼悯蝉,長吁一口氣:“原來是場噩夢啊……” “哼归形!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鼻由,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤暇榴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蕉世,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跺撼,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年讨彼,在試婚紗的時候發(fā)現(xiàn)自己被綠了歉井。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡哈误,死狀恐怖哩至,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜜自,我是刑警寧澤菩貌,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站重荠,受9級特大地震影響箭阶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戈鲁,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一仇参、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婆殿,春花似錦诈乒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至消约,卻和暖如春肠鲫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背或粮。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工导饲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓帜消,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浓体。 傳聞我的和親對象是個殘疾皇子泡挺,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,176評論 2 33
  • 本文承接之前寫的三十分鐘學會AWK一文,在學習完AWK之后命浴,趁熱打鐵又學習了一下SED娄猫,不得不說這兩個工具真的堪稱...
    mylxsw閱讀 4,401評論 3 74
  • sed篇總共分成6章:(簡書版) Sed&awk筆記之sed篇:簡單介紹 Sed&awk筆記之sed篇:模式空間與...
    magic5650閱讀 831評論 0 3
  • sed與awk實例 文本間隔 在每一行后面增加一空行 將原來的所有空行刪除并在每一行后面增加一空行。這樣在輸出的文...
    stuha閱讀 1,901評論 0 21
  • Ubuntu的發(fā)音 Ubuntu悬蔽,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音捉兴。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,374評論 9 467