1. 程式人生 > >Linux 命令之 sed

Linux 命令之 sed

sed
stream editor的縮寫.
流編輯器,用程式的方式來編輯文字,相當的hacker啊。
sed基本上就是玩正則模式匹配,所以,玩sed的人,正則表示式一般都比較強。

AWK之所以叫AWK是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字元, 是貝爾實驗室1977年搞出來的文字出現神器, sed比awk還要年長2-3歲。
都稱得上是上古神器。

下面學習幾個sed常見使用:

測試使用的文字內容

[[email protected]]# cat sed.test 
I
love her. I love her. I love her. I love her. I love her. I love her.

1. s 替換命令

a. 把文字中的her 替換成Joey
s表示替換命令,/her/表示匹配her,/Joey/表示把匹配替換成Joey,/g 表示替換行內所有的匹配

[[email protected]]# sed "s/her/Joey/g" sed.test   
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.

上面的sed命令並沒有對檔案的內容改變,只是把處理過後的內容輸出介面

如果要修改所操作檔案的內容,可以加上 -i 引數直接修改檔案內容
sed -i “s/her/Joey/g” sed.test

b. 其他一些常用的匹配
在每行最前面加#字元:

$ sed 's/^/#/g' sed.test

在每一行最後面加—:

sed 's/$/ --- /g' sed.test

c. 多行匹配
如果我們需要一次替換多個模式,可參看下面的示例:(第一個模式把第一行到第三行的I替換成Jobs,第二個則把第3行以後的I替換成了He also)

[root@localhost]# sed '1,3s/I/Jobs/g; 3,$s/I/He also/g' sed.test 
Jobs
love Joey. Jobs love Joey. Jobs love Joey. He also love Joey. He also love Joey. He also love Joey.

我們可以使用 & 來當做被匹配的變數,然後可以在變數左右加點東西

[[email protected] ]# sed 's/Joey/{&}/g' sed.test 
I love {Joey}.
I love {Joey}.
I love {Joey}.
I love {Joey}.
I love {Joey}.
I love {Joey}.

d. a命令和i命令
a命令就是append, i命令就是insert,它們是用來新增行的。
在第一行插入

[[email protected] ]# sed "1 i ------------insert---------------- " sed.test          
------------insert---------------- 
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.

在最後一行插入

[[email protected] ]# sed "$ a ------------insert---------------- " sed.test 
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.
------------insert----------------

如果不指定位置,則每一行後面都會新增一行

e. 刪除匹配行 d命令

[[email protected]]# cat sed.test 
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.
------------insert---------------- 
[[email protected]]# sed '/insert/d' sed.test 
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.

f. 列印命令 p命令
使用 -n 可以只輸出匹配的行,就像linux 的grep 命令
如果不使用-n則未匹配的正常輸出,匹配的輸出兩次

[[email protected] luffy]# sed -n '/Joey/p' sed.test 
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.
I love Joey.

相關推薦

no