sed命令詳解-應用篇

本篇從實用的角度講解sed,關於sed的詳細幫助文檔,請參考前篇html

http://www.cnblogs.com/the-capricornus/p/5279979.html正則表達式

本篇用到的選項請參考前篇。安全

本篇用到的地址相關的內容請參考前篇。htm

本篇大概分3部分:基本應用、模式空間、標籤。blog

sed能夠直接處理文本文件,也能夠處理管道中的文本。文檔

sed一般狀況下每次處理一行文本,這行文本保存在sed的模式空間內。sed

那有哪些不一般的狀況呢?好比你使用N命令往模式空間追加了一行內容。file

如今說說sed均可以進行哪些操做。引用

咱們先從基本的操做入手:文件讀取

=  打印行號
a\ 追加新行
i\ 插入新行
p  打印
q  退出
Q  當即退出
r  追加從文件讀取的文本
c\ 行替換
s  替換

P  打印模式空間的第一行
R  追加從文件讀取的一行

再來講說高級操做,高級操做都是圍繞模式空間展開的:

d 刪除模式空間
h 複製模式空間到保持空間
g 複製保持空間到模式空間

n 讀取下一行到模式空間
w 寫模式空間到文件
x 交換模式空間和保持空間
y 將模式空間內source裏的字符轉換成dest裏對應的字符

G 追加保持空間到模式空間
H 追加模式空間到保持空間
N 追加下一行到模式空間
D 刪除模式空間中的一行
W 寫模式空間的第一行到文件

再來圍繞標籤來談談高級操做:

: 爲b和t命令定義標籤
b 切換到標籤
t 若是前面的替換成功切換到標籤
T 若是前邊的替換失敗切換到標籤

基本應用

sed默認打印模式空間的內容到輸出上。若是你執行了以下的命令:

echo -e "abc\ndef" | sed 'p'

每行都打印2遍,一遍是默認的對模式空間的打印,一遍是p命令的打印。

若是你加上選項-n,每行只打印一遍。默認的對模式空間的打印被關閉。

echo -e "abc\ndef" | sed -n 'p'

若是你執行的了刪除模式空間的操做,則被刪除的模式空間將不被打印。

echo -e "abc\ndef" | sed '1d'

下面的命令會在每一行的前邊加上一行,內容是行號。

echo -e "abc\ndef" | sed '='

那你想知道總共有多少行,你可使用以下的命令,這個能夠用來統計文本行數。

echo -e "abc\ndef" | sed -n '$='

追加行很少說,可是被追加的行即便你使用了抑制模式,仍是會被打印出來的。

echo -e "abc\ndef" | sed -n 'a\s'

要注意的一點是,你啓用-i選項編輯文件時,你同時用了-n選項的話,要知道後果有多嚴重。

就是文件的全部內容將被輸出替換掉。好比你執行了以下的操做:

sed -ni '1a\Note:all content is deleted.' aaa

則文件aaa的內容將只有一行啦,全部的數據都丟失啦,太可怕啦,文件操做必定要謹慎。

爲了安全起見,在文件操做以前,先生成一個文件的備份。

sed -n -i_bak '1a\Note:all content is deleted.' aaa

將先生成aaa的備份文件aaa_bak,而後進行文件操做。

-i選項就是這樣的,你指定了備份就生成,你不指定就不生成。

你能夠利用sed命令來合併2個文檔,下面的命令把file1的內容追加到file2的結尾。

sed -i '$rfile1' file2

若是你使用了大寫的R,則文件變成file2一行,file1一行這樣的交替這來。

sed -i '$Rfile1' file2

下面的栗子將把第一行替換成str:

echo -e "abc\ndef" | sed '1c\str'

你想在處理完某行就退出嗎?下面的栗子處理完第一行就退出:

echo -e "abc\ndef" | sed '1q'

下面的栗子你看和上面的栗子有什麼不一樣?

echo -e "abc\ndef" | sed '1Q'

連模式空間都不打印了,當即退出

上面說了那麼多栗子,用的都是行取地址,其實也可使用正則表達式取地址。

用2個斜槓就表示裏邊的內容是正則表達式。

echo -e "abc\ndef" | sed '/abc/c\str'

那你想把abc替換成def的話,以下使用

echo -e "abc" | sed 's/abc/def/'

上面的命令只替換模式空間中第一次出現的,若是你想替換全部的,加上標誌g

echo -e "abc\nabc" | sed 's/abc/def/g'

還有不少標誌請參考前篇文檔。

下面從模式空間的角度來談談高級應用。

下面的栗子將建立文件aaa並往裏邊寫入2行。

echo -e 'abc\ndef' | sed 'waaa'

下面的栗子p命令打印的是偶數行

echo -e 'abc\ndef\nghi\njkl' | sed -n 'n;p'

對於上面的命令,用分號隔開2個操做,對每一行都會執行全部的操做。

操做第一行時,n讀取第二行到模式空間,接着打印,打印的內容是第二行。

而後操做第三行,n讀取第四行到模式空間,接着打印,打印的內容是第四行。

可是若是你使用N操做,將是追加下一行到模式空間,p打印2行內容

echo -e 'abc\ndef\nghi\njkl' | sed -n 'N;p'

下邊是一個對應字符替換的栗子,將輸出 1xx2xx3xx

echo "axxbxxcxx" | sed 'y/abc/123/'

下邊的命令將只打印奇數行

echo -e 'abc\ndef\nghi\njkl' | sed -n 'h;n;g;p'

下邊的命令也是隻打印了奇數行

echo -e 'abc\ndef\nghi\njkl' | sed -n 'h;n;x;p'

下邊的命令把偶數行和奇數行的順序互換

echo -e 'abc\ndef\nghi\njkl' | sed -n 'h;n;G;p'

下面從標籤的角度來談談高級應用

用:定義一個標籤,用b切換到標籤

echo -e "abc\ndef\nghi\njkl" | sed -n '/[a,j]/b label;y/abcdefghijkl/0123456789AB/;:label;p'

b是無條件跳轉,而t是有條件跳轉的,那就是它前邊的s///命令執行成功的話,它就跳轉

echo -e "abcdefg\nhi\njkl" | sed ':label;s/^.\{1,19\}$/ &/;tlabel'

上面的命令正則表達式是^.{1,19}$,就是1到19個任意字符,&是一個引用,內容就是正則表達式匹配到的。

不到19個字符總會匹配成功,匹配成功就替換成空格加引用。最後全部的行都變成20個字符寬度的右對齊。

相關文章
相關標籤/搜索