sed工具丰富的功能介绍

描述

以前用vim操作文档的时候,可以查找也可以替换,但只限于在文本内部操作,而不能输出到屏幕上。sed工具以及后面要介绍的awk工具就能把替换的文本输出到屏幕上,而且还有其他更丰富的功能。

12.2.1 打印某行

sed命令的格式为:sed -n 'n'p filename,单引号内的n是一个数字,表示第几行。-n选项的作用是只显示我们要打印的行,无关紧要的内容不显示。示例命令如下:

 

# sed -n '2'p /etc/passwd
bin1bin:/bin:/sbin/nologin
你可以去掉-n选项对比一下差异。要想把所有行都打印出来,可以使用命令sed -n '1,$'p filename,如下所示:
# sed -n '1,$'p test.txt
rot0/rot:/bin/bash
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

 

当然,我们也可以指定一个区间打印,如下所示:

 

# sed -n '1,3'p test.txt
rot0/rot:/bin/bash
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin

 

12.2.2 打印包含某个字符串的行

示例命令如下:

 

# sed -n '/root/'p test.txt
operator11operator:/root:/sbin/nologin
这种用法就类似于grep了,在grep中使用的特殊字符(如^、$、.、*等)同样也能在sed中使用,如下所示:
# sed -n '/^1/'p test.txt
1111111111111111111111111111111
# sed -n '/in$/'p test.txt
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
# sed -n '/r..o/'p test.txt
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
# sed -n '/ooo*/'p test.txt
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash

 

sed命令加上-e选项可以实现多个行为,如下所示:

 

# sed -e '1'p -e '/111/'p -n test.txt
rot0/rot:/bin/bash
1111111111111111111111111111111

 

12.2.3 删除某些行

示例命令如下:

 

# sed '1'd test.txt
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# sed '1,3'd test.txt
roooot0/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# sed '/oot/'d test.txt
rot0/rot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
这里参数d表示删除的动作,它不仅可以删除指定的单行以及多行,而且可以删除匹配某个字符的行,还可以删除从某一行开始到文档最后一行的所有行。

不过,这个操作仅仅是在显示器屏幕上并不显示这些行而已,文档还好好的,请不要担心。

 

12.2.4 替换字符或者字符串

示例命令如下:

 

# sed '1,2s/ot/to/g' test.txt
rto0/rto:/bin/bash
operator11operator:/roto:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
上例中的参数s就表示替换的动作,参数g表示本行全局替换,如果不加g则只替换本行出现的第一个,这个用法其实和vim的替换大同小异。 除了可以使用/作为分隔符外,我们还可以使用其他特殊字符,例如#和@。如下所示:

 

 

# sed 's#ot#to#g' test.txt
rto0/rto:/bin/bash
operator11operator:/roto:/sbin/nologin
operator11operator:/rooto:/sbin/nologin
roooto0/rooooto:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# sed 's@ot@to@g' test.txt
rto0/rto:/bin/bash
operator11operator:/roto:/sbin/nologin
operator11operator:/rooto:/sbin/nologin
roooto0/rooooto:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

 

现在思考一下:如何删除文档中所有的数字或者字母?示例命令如下:

 

# sed 's/[0-9]//g' test.txt
rot::/rot:/bin/bash
operator:/root:/sbin/nologin
operator:/rooot:/sbin/nologin
roooot::/rooooot:/bin/bash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

 

[0-9]表示任意的数字。这里你也可以写成[a-zA-Z]或者[0-9a-zA-Z]。如下所示:

 

# sed 's/[a-zA-Z]//g' test.txt
:0:/://
:0::/://
:0::/://
:0:/://
1111111111111111111111111111111

 

12.2.5 调换两个字符串的位置

示例命令如下:

 

# sed 's/(rot)(.*)(bash)/321/' test.txt
bash0/rot:/bin/rot
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
小括号在sed中属于特殊符号,必须在前面加转义字符,替换时则写成类似1、2或3的形式。上例中用()把想要替换的字符打包成了一个整体。

有这个转义字符,会让这个表达式看起来乱糟糟的,阿铭有个方法可以省略它。如下所示:
# sed -r 's/(rot)(.*)(bash)/321/' test.txt
bash0/rot:/bin/rot
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
没错,正如你看到的,就是这个-r选项让这个表达式更加清晰了,-r的作用跟grep的-E的作用是一样的,它让sed支持扩展正则,扩展正则其实就是使用了诸如:()、{}、|、+、?等特殊符号的正则。

除了调换两个字符串的位置,阿铭还常常用sed在某一行前后增加指定内容,如下所示:
# sed 's/^.*$/123&/' test.txt
123rot0/rot:/bin/bash
123operator11operator:/root:/sbin/nologin
123operator11operator:/rooot:/sbin/nologin
123roooot0/rooooot:/bin/bash
1231111111111111111111111111111111
123aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

 

12.2.6 直接修改文件的内容

示例命令如下:

 

# sed -i 's/ot/to/g' test.txt
# cat test.txt
rto0/rto:/bin/bash
operator11operator:/roto:/sbin/nologin
operator11operator:/rooto:/sbin/nologin
roooto0/rooooto:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
这样就可以直接更改test.txt文件中的内容了。但必须注意,在修改前最好先备份一下文件,以免改错。 好了,我总结了这些,你看还有补充的么?

 





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分