sed工具
sed是一种功能强大的流编辑器,是针对文档的行来操作的。它能对文档查找、替换并且将替换结果显示到屏幕。
- 打印某行
sed命令的格式为:sed -n 'n'p filename
。-n选项的作用是只显示指定要打印的行,其他内容不显示。单引号内的n是一个数字,表示第几行。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 \\打印指定区间的行
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选项可以实现多个行为,如下所示:
[root@minglinux ~]# sed -e '3'p -e '/root/'p -e '/^a/'p -n test.txt
aaaaaaaaaabbbb
root
12345678
- 删除某些行
sed中参数d表示删除的动作,它不仅可以删除指定的单行以及多行,而且可以删除匹配某个字符的行,还可以删除从某一行开始到文档最后一行的所有行。不过,这仅仅是显示效果而已,文档内容不会改变。示例命令如下:
[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的参数s就表示替换的动作,参数g表示本行全局替换,如果不加g则只替换本行出现的第一个。示例命令如下:
[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
除了可以使用/作为分隔符外,我们还可以使用其他特殊字符,例如#和@。
删除文档中所有的数字和字母的命令如下:
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/[0-9a-zA-Z]//g' test.txt
@#%%&^*(
- 调换两个字符串的位置
示例命令如下:
[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中属于特殊符号,必须在前面加转义字符\,替换时则写成类似\1、\2或\3的形式。上例中用()把想要替换的字符打包成了一个整体。使用这么多的转义符让命令行看着很乱,我们使用sed加-r选项可以省去转义符,所下所示:
[root@minglinux ~]# sed -r 's/(r)(.*)(t)/\3\2\1/' test.txt
aaaaaaaaaabbbb
toor
12345678
@#%%&^*(
abcdef
- 在某一行前后增加指定内容
[root@minglinux ~]# sed '1s/^.*$/&123/' test.txt
aaaaaaaaaabbbb123
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/^.*$/123&/' test.txt
123aaaaaaaaaabbbb
123root
12312345678
123@#%%&^*(
123abcdef
- 直接修改文件的内容
sed -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
网友评论