以前用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 '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文件中的内容了。但必须注意,在修改前最好先备份一下文件,以免改错。 好了,我总结了这些,你看还有补充的么?
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !