sed

作者: XiaoMing丶 | 来源:发表于2018-10-17 22:14 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:sed

          本文链接:https://www.haomeiwen.com/subject/hxslzftx.html