sed 命令詳解

sed 即 stream editor谷饿,一個簡單而強(qiáng)大的文本解析轉(zhuǎn)換工具钾唬,1973-1974年期間由貝爾實(shí)驗室的 Lee E. McMahon 開發(fā)镶骗,能夠完美的配合正則表達(dá)式使用赃春。
處理文本時静秆,當(dāng)前處理的行會先存儲在臨時緩沖區(qū)中,稱為模式空間(pattern space)严衬,操作完成后再把緩沖區(qū)的內(nèi)容送往屏幕澄者。接著處理下一行,直到文件末尾请琳。文件內(nèi)容并沒有改變粱挡,除非使用重定向存儲輸出。
sed 主要用來自動編輯一個或多個文件俄精,簡化對文件的反復(fù)操作询筏,編寫轉(zhuǎn)換程序等。

1. 使用 s 命令替換

基本使用

sed 默認(rèn)情況下通過 STDIN 輸入流讀取數(shù)據(jù)竖慧,可以利用管道符(|)進(jìn)行重定向嫌套。如下:

$ echo "This is a test" | sed 's/test/big test/'
This is a big test

s 替換命令的格式為:s/pattern/replacement/flags ,如下:

$ cat test.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
$
$ sed 's/dog/cat/' test.txt
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.

使用 s 命令進(jìn)行替換時圾旨,默認(rèn)只替換每行中的第一個匹配灌危。全局替換需增加 g 選項。

$ sed 's/o/O/g' test.txt
The quick brOwn fOx jumps Over the lazy dOg.
The quick brOwn fOx jumps Over the lazy dOg.
The quick brOwn fOx jumps Over the lazy dOg.
The quick brOwn fOx jumps Over the lazy dOg.

sed 默認(rèn)只將處理后的內(nèi)容輸出碳胳,而不對原文件的內(nèi)容做任何改動。如需寫入文件沫勿,可使用重定向:$ sed 's/dog/cat/' test.txt > test2.txt
或通過 -i 選項直接修改文件內(nèi)容:$ sed -i 's/dog/cat/' test.txt

address

如果需要將命令應(yīng)用到特定的一行或多行內(nèi)容挨约,可以使用 line addressing。格式為 [address[,address]][!]command产雹。
address 可以是數(shù)字模式诫惭,也可以通過逗號分隔兩個 address 表示一個區(qū)間范圍。
如只將第2行中的 dog 替換為 cat

$ sed '2s/dog/cat/' test.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.

或者$ sed '1,3s/dog/cat/' test.txt蔓挖,替換1-3行的內(nèi)容夕土。
$ sed '2,$s/dog/cat/' test.txt,替換第2行到最后一行的內(nèi)容。

! 表示完成匹配后是否在該行執(zhí)行替換命令怨绣。加上 ! 表示不執(zhí)行角溃。如下:

$ cat lines.txt
This is line one
This is line two
This is line three
This is line four
$
$ sed '/one/,2s/line/LINE/' lines.txt
This is LINE one
This is LINE two
This is line three
This is line four
$
$ sed '/one/,2!s/line/LINE/' lines.txt
This is line one
This is line two
This is LINE three
This is LINE four
替換選項

sed 的替換命令除了可以附加 g 選項(全局替換)外,還有更多選項適用于不同的情形篮撑。

  • 數(shù)字减细。表示只替換每行中的第 n 個匹配項,如:
$ sed 's/o/O/2' test.txt
The quick brown fOx jumps over the lazy dog.
The quick brown fOx jumps over the lazy dog.
The quick brown fOx jumps over the lazy dog.
The quick brown fOx jumps over the lazy dog.

$ sed 's/o/O/2g' test.txt 替換每行中從第二個開始的所有匹配項(即替換每行中從第二個 o 開始直到該行行尾的所有 o 字符)

  • p赢笨,表示打印處理前的原始內(nèi)容未蝌,結(jié)合上 -n 選項(不打印輸出)則可以只輸出處理過的內(nèi)容。
$ sed 's/three/3/p' lines.txt
This is line one
This is line two
This is line 3
This is line 3
This is line four
$
$ sed -n 's/three/3/p' lines.txt
This is line 3
  • w茧妒,將處理過的內(nèi)容寫入文件
$ sed 's/three/3/w line3.txt' lines.txt
$
$ cat line3.txt
This is line 3
sed 命令選項
  • 刪除:d
    $ sed '2,$d' lines.txt 刪除 lines.txt 中第2行到最后一行的內(nèi)容萧吠。
    $ sed '/two/d' lines.txt 刪除 lines.txt 中包含 two 的行。
  • 追加(行下):a
$ sed '/two/a\
> This is a line behind line 2' lines.txt
This is line one
This is line two
This is a line behind line 2
This is line three
This is line four
  • 插入(行上):i
$ sed '2i\
> This is a line above line 2' lines.txt

在第2行以上插入內(nèi)容桐筏。

  • 修改:c
$ sed '/two/c\
> Line 2' lines.txt

將包含 two 的行修改為 Line 2(整行內(nèi)容替換為 Line 2)纸型。

  • 字符轉(zhuǎn)換:y
    格式為:[address]y/inchars/outchars/
    輸入文件中所有包含在 inchars 中的字符都將替換為 outchars 中對應(yīng)的字符。
$ cat line_number.txt
This is line 1.
This is line 2.
This is line 3.
This is another line 1.
$
$ sed 'y/123/456/' line_number.txt
This is line 4.
This is line 5.
This is line 6.
This is another line 4.
其他用法
  • 打印輸出
    sed 的 p 命令可以達(dá)到類似 grep 的效果九昧,結(jié)合上 address 功能還可以完成更復(fù)雜的篩選打印操作绊袋。
$ sed -n 'p' lines.txt
This is line one
This is line two
This is line three
This is line four
$
$ sed -n '2,3p' lines.txt
This is line two
This is line three
$
$sed -n '/two/,/three/p' lines.txt
This is line two
This is line three
  • 多個匹配
    可以通過 -e 選項實(shí)現(xiàn)多個匹配的替換
$ sed -e 's/fox/kangaroo/;s/dog/cat/' test.txt
The quick brown kangaroo jumps over the lazy cat.
The quick brown kangaroo jumps over the lazy cat.
The quick brown kangaroo jumps over the lazy cat.
The quick brown kangaroo jumps over the lazy cat.

也可以這樣:

$ sed -e '
> s/brown/red/
> s/fox/kangaroo/
> s/dog/cat/' test.txt
The quick red kangaroo jumps over the lazy cat.
The quick red kangaroo jumps over the lazy cat.
The quick red kangaroo jumps over the lazy cat.
The quick red kangaroo jumps over the lazy cat.
  • 從腳本文件中讀取命令
$ cat script.sed
s/brown/red/
s/fox/kangaroo/
s/dog/cat
$
$ sed -f script.sed test.txt
The quick red kangaroo jumps over the lazy cat.
The quick red kangaroo jumps over the lazy cat.
The quick red kangaroo jumps over the lazy cat.
The quick red kangaroo jumps over the lazy cat.
  • 可以使用 & 變量表示前面的匹配項,如:
$ sed 's/fox/&es/' test.txt
The quick brown foxes jumps over the lazy dog.
The quick brown foxes jumps over the lazy dog.
The quick brown foxes jumps over the lazy dog.
The quick brown foxes jumps over the lazy dog.

參考書籍和文章:

Linux Command Line and Shell Scripting Bible, 3rd Edition
SED 簡明教程 by 陳皓
Linux 命令大全 / SED 命令

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铸鹰,一起剝皮案震驚了整個濱河市癌别,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹋笼,老刑警劉巖展姐,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剖毯,居然都是意外死亡圾笨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門逊谋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擂达,“玉大人,你說我怎么就攤上這事胶滋“鬻蓿” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵究恤,是天一觀的道長俭令。 經(jīng)常有香客問我,道長部宿,這世上最難降的妖魔是什么抄腔? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上赫蛇,老公的妹妹穿的比我還像新娘绵患。我一直安慰自己,他們只是感情好棍掐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布藏雏。 她就那樣靜靜地躺著,像睡著了一般作煌。 火紅的嫁衣襯著肌膚如雪掘殴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天粟誓,我揣著相機(jī)與錄音奏寨,去河邊找鬼。 笑死鹰服,一個胖子當(dāng)著我的面吹牛病瞳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悲酷,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼套菜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了设易?” 一聲冷哼從身側(cè)響起逗柴,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顿肺,沒想到半個月后戏溺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屠尊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年旷祸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讼昆。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡托享,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浸赫,到底是詐尸還是另有隱情闰围,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布掺炭,位于F島的核電站,受9級特大地震影響凭戴,放射性物質(zhì)發(fā)生泄漏涧狮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望者冤。 院中可真熱鬧肤视,春花似錦、人聲如沸涉枫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愿汰。三九已至困后,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衬廷,已是汗流浹背摇予。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吗跋,地道東北人侧戴。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像跌宛,于是被迫代替她去往敵國和親酗宋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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

  • 原文鏈接:sed命令_Linux sed 命令用法詳解:功能強(qiáng)大的流式文本編輯器 http://man.linu...
    e2ae5d4bd7c1閱讀 793評論 0 1
  • linux sed命令詳解 1. Sed簡介 sed 是一種在線編輯器疆拘,它一次處理一行內(nèi)容蜕猫。處理時,把當(dāng)前處理的行...
    很少更新了閱讀 2,156評論 0 6
  • shell sed命令詳解 sed是一種在線編輯器入问,它一次處理一行內(nèi)容丹锹。處理時,把當(dāng)前處理的行存儲在臨時緩沖區(qū)中...
    zplodge閱讀 1,913評論 0 0
  • 1. 簡介 sed命令是一個很強(qiáng)大的文本編輯器芬失,可以對來自文件楣黍、以及標(biāo)準(zhǔn)輸入的文本進(jìn)行編輯。 執(zhí)行時棱烂,sed會從文...
    tyrone_li閱讀 21,589評論 2 12
  • 本文承接之前寫的三十分鐘學(xué)會AWK一文租漂,在學(xué)習(xí)完AWK之后,趁熱打鐵又學(xué)習(xí)了一下SED颊糜,不得不說這兩個工具真的堪稱...
    mylxsw閱讀 4,391評論 3 74