1. 程式人生 > >linux的sed工具使用介紹

linux的sed工具使用介紹

linux sed

sed工具的使用介紹

其實grep工具的功能還不夠強大,它實現的只是查找功能,而不能把查找的內容替換,以前用vim操作文檔的時候,可以查找也可以替換,但只限於在文本內部操作,而不能輸出到屏幕上,sed工具就能把替換的文本輸出到屏幕上,而且還有其他更豐富的功能。sed是流式編輯器,是針對文檔的行來操作的。


1. 打印某行
sed命令的格式為:sed -n ‘n‘p filename
解釋:單引號內的n是一個數字,表示第幾行,-n選項的作用是只顯示我們要打印的行,無關緊要的內容不顯示。

示例如下:

[root@aminglinux-01 grep]# sed -n ‘2‘p passwd
bin:x:1:1:bin:/bin:/sbin/NOlogin

如果想打印所有行,可以使用命令sed -n ‘1,$‘p filename,示例如下:

[root@aminglinux-01 grep]# sed -n ‘1,$‘p test.txt 
rot:x:o:o:/rot:/bin/bash
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

也可以指定一個區間打印,示例如下:

[root@aminglinux-01 grep]# sed -n ‘1,$‘p test.txt 
rot:x:o:o:/rot:/bin/bash
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

2. 打印包含某個字符串的行:

示例如下:

[root@aminglinux-01 sed]# sed -n ‘/root/‘p test.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

這種方法就類似於grep了,在grep中使用的特殊字符(如^、$、.、*等)同樣也能在sed中使用,如下所示:

[root@aminglinux-01 sed]# sed -n ‘/^1/‘p /root/grep/test.txt
1111111111111111111111111111111
[root@aminglinux-01 sed]# sed -n ‘/in$/‘p /root/grep/test.txt
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
[root@aminglinux-01 sed]# sed -n ‘/r..o/‘p /root/grep/test.txt
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
[root@aminglinux-01 sed]# sed -n ‘/ooo*/‘p /root/grep/test.txt
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash

sed命令加上-e選項可以實現多個行為,如下所示:

[root@aminglinux-01 sed]# sed -e ‘1‘p -e ‘/111/‘p -n /root/grep/test.txt
rot:x:o:o:/rot:/bin/bash
1111111111111111111111111111111

3. 刪除某些行

示例如下:

[root@aminglinux-01 sed]# sed ‘1‘d /root/grep/test.txt 
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@aminglinux-01 sed]# sed ‘1,3‘d /root/grep/test.txt 
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@aminglinux-01 sed]# sed ‘/oot/‘d /root/grep/test.txt 
rot:x:o:o:/rot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

解釋:這裏的參數d表示刪除的動作,它不僅可以刪除指定的單行以及多行,而且可以刪除匹配某個字符的行,還可以刪除從某一行開始到文檔最後一行的所有行。不過,這個操作僅僅是在顯示器屏幕上並不顯示這些行而已,文檔還是好好的,不用擔心。


4. 替換字符或者字符串

示例命令如下:

[root@aminglinux-01 sed]# cat /root/grep/test.txt //原先文件
rot:x:o:o:/rot:/bin/bash
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@aminglinux-01 sed]# sed ‘1,2s/ot/to/g‘ /root/grep/test.txt   //執行命令後的文件,仔細看兩者之間的不同。
rto:x:o:o:/rto:/bin/bash
operator:x:11:o:operator:/roto:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

解釋:上例中的參數s就表示替換的動作,參數g表示本行全局替換,如果不加g則只替換本行出現的第一個,這個用法其實各vim的替換大同小異。

###### 擴展知識: 除了可以使用/作為分隔符外,我們還可以使用其他特殊字符,例如#和@,如下所示:

[root@aminglinux-01 sed]# cat /root/grep/test.txt //原先文件
rot:x:o:o:/rot:/bin/bash
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@aminglinux-01 sed]# sed ‘1,2s/ot/to/g‘ /root/grep/test.txt   //執行命令後的文件,仔細看兩者之間的不同。
rto:x:o:o:/rto:/bin/bash
operator:x:11:o:operator:/roto:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

那我們思考下,如何刪除文檔中所有的數字或字母?示例命令如下:

[root@aminglinux-01 sed]# sed ‘s/[0-9]//g‘ /root/grep/test.txt 
rot:x:o:o:/rot:/bin/bash
operator:x::o:operator:/root:/sbin/nologin
operator:x::o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash

解釋:[0-9]表示任意的數字,這裏你也可以寫成[a-zA-Z]或者[0-9a-zA-z]。如下所示:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@aminglinux-01 sed]# sed ‘s/[a-zA-Z]//g‘ /root/grep/test.txt 
::::/://
::11:::/://
::11:::/://
::::/://
1111111111111111111111111111111
5. 調換兩個字符串的位置

示例如下:

[root@aminglinux-01 sed]# cat /root/grep/test.txt //查看原文件
rot:x:o:o:/rot:/bin/bash
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@aminglinux-01 sed]# sed ‘s/\(rot\)\(.*\)\(bash\)/\3\2\1/‘ /root/grep/test.txt 
bash:x:o:o:/rot:/bin/rot
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

解釋:小括號在sed中屬於特殊符號,必須在前面加轉義字符\,替換時則寫成類似\1、\2、或\3的形式。上例中用()把想要替換的字符打包成了一個整體。

有這個轉義字符\,會讓這個表達式看起來亂槽槽的,可以換一種方式省略它,如下所示:

[root@aminglinux-01 sed]# sed -r ‘s/(rot)(.*)(bash)/\3\2\1/‘ /root/grep/test.txt 
bash:x:o:o:/rot:/bin/rot
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

從這裏可以看出,就是這個-r選項讓這個表達式更加清晰了。除了調換兩個字符串的位置,還可以使用sed在某一行前後增加指定內容,如下所示:

[root@aminglinux-01 sed]# sed ‘s/^.*$/123&/‘ /root/grep/test.txt 
123rot:x:o:o:/rot:/bin/bash
123operator:x:11:o:operator:/root:/sbin/nologin
123operator:x:11:o:operator:/rooot:/sbin/nologin
123roooot:x:o:o:/roooooot:/bin/bash
1231111111111111111111111111111111
123aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

6. 直接修改文件的內容

示例如下:

[root@aminglinux-01 sed]# cat /root/grep/test.txt 
rot:x:o:o:/rot:/bin/bash
operator:x:11:o:operator:/root:/sbin/nologin
operator:x:11:o:operator:/rooot:/sbin/nologin
roooot:x:o:o:/roooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@aminglinux-01 sed]# sed -i ‘s/ot/to/g‘ /root/grep/test.txt 
[root@aminglinux-01 sed]# cat /root/grep/test.txt 
rto:x:o:o:/rto:/bin/bash
operator:x:11:o:operator:/roto:/sbin/nologin
operator:x:11:o:operator:/rooto:/sbin/nologin
roooto:x:o:o:/roooooto:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

解釋:這樣就可以直接修改test.txt文件中的內容了,但必須註意,在修改前最好先備份一個文件,以免改錯。


本文出自 “Gary博客” 博客,請務必保留此出處http://taoxie.blog.51cto.com/10245493/1983919

linux的sed工具使用介紹