sed工具
sed是一種功能強大的流編輯器,是針對文檔的行來操作的。它能對文檔查找、替換并且將替換結(jié)果顯示到屏幕。
- 打印某行
sed命令的格式為:sed -n 'n'p filename。-n選項的作用是只顯示指定要打印的行,其他內(nèi)容不顯示。單引號內(nèi)的n是一個數(shù)字,表示第幾行。p是打印的意思。示例命令如下:
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
[root@minglinux ~]# sed -n '2'p test.txt
root
[root@minglinux ~]# sed '2'p test.txt \\去掉-n
aaaaaaaaaabbbb
root
root
12345678
@#%%&^*(
[root@minglinux ~]# sed -n '1,3'p test.txt \\打印指定區(qū)間的行
aaaaaaaaaabbbb
root
12345678
[root@minglinux ~]# sed -n '1,$'p test.txt \\打印所有行
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
上例我們可以看到,sed '2'p test.txt去掉-n選項時,屏幕顯示打印了第二行兩次,這是因為sed默認會打印文件中所有行。
- 打印包含某個字符串的行
這個用法類似grep,就不過多注解了,示例命令如下:
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
[root@minglinux ~]# sed -n '/aa/'p test.txt
aaaaaaaaaabbbb
[root@minglinux ~]# sed -n '/^1/'p test.txt
12345678
[root@minglinux ~]# sed -n '/($/'p test.txt
@#%%&^*(
[root@minglinux ~]# sed -n '/r.o/'p test.txt
root
[root@minglinux ~]# sed -n '/oo*/'p test.txt
root
sed命令加上-e選項可以實現(xiàn)多個行為,如下所示:
[root@minglinux ~]# sed -e '3'p -e '/root/'p -e '/^a/'p -n test.txt
aaaaaaaaaabbbb
root
12345678
- 刪除某些行
sed中參數(shù)d表示刪除的動作,它不僅可以刪除指定的單行以及多行,而且可以刪除匹配某個字符的行,還可以刪除從某一行開始到文檔最后一行的所有行。不過,這僅僅是顯示效果而已,文檔內(nèi)容不會改變。示例命令如下:
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
[root@minglinux ~]# sed '4'd test.txt
aaaaaaaaaabbbb
root
12345678
[root@minglinux ~]# sed '1,3'd test.txt
@#%%&^*(
[root@minglinux ~]# sed '/roo/'d test.txt
aaaaaaaaaabbbb
12345678
@#%%&^*(
- 替換字符或者字符串
sed的參數(shù)s就表示替換的動作,參數(shù)g表示本行全局替換,如果不加g則只替換本行出現(xiàn)的第一個。示例命令如下:
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed '1s/a/A/g' test.txt
AAAAAAAAAAbbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed '1s/a/A/' test.txt
Aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/a/A/' test.txt
Aaaaaaaaaabbbb
root
12345678
@#%%&^*(
Abcdef
[root@minglinux ~]# sed 's/a/A/g' test.txt
AAAAAAAAAAbbbb
root
12345678
@#%%&^*(
Abcdef
除了可以使用/作為分隔符外,我們還可以使用其他特殊字符,例如#和@。
刪除文檔中所有的數(shù)字和字母的命令如下:
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/[0-9a-zA-Z]//g' test.txt
@#%%&^*(
- 調(diào)換兩個字符串的位置
示例命令如下:
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/\(r\)\(.*\)\(t\)/\3\2\1/' test.txt
aaaaaaaaaabbbb
toor
12345678
@#%%&^*(
abcdef
小括號在sed中屬于特殊符號,必須在前面加轉(zhuǎn)義字符\,替換時則寫成類似\1、\2或\3的形式。上例中用()把想要替換的字符打包成了一個整體。使用這么多的轉(zhuǎn)義符讓命令行看著很亂,我們使用sed加-r選項可以省去轉(zhuǎn)義符,所下所示:
[root@minglinux ~]# sed -r 's/(r)(.*)(t)/\3\2\1/' test.txt
aaaaaaaaaabbbb
toor
12345678
@#%%&^*(
abcdef
- 在某一行前后增加指定內(nèi)容
[root@minglinux ~]# sed '1s/^.*$/&123/' test.txt
aaaaaaaaaabbbb123
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/^.*$/123&/' test.txt
123aaaaaaaaaabbbb
123root
12312345678
123@#%%&^*(
123abcdef
- 直接修改文件的內(nèi)容
sed -i :直接修改讀取的文件內(nèi)容,而不是輸出到終端。
示例命令如下:
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed -i 's/123/abc/g' test.txt
[root@minglinux ~]# cat test.txt
aaaaaaaaabbbb
root
abc45678
@#%%&^*(
abcdef