美文网首页
sed 文本处理

sed 文本处理

作者: 今天有什么新鲜事呀 | 来源:发表于2023-03-27 17:54 被阅读0次

    语法

    sed [选项] [命令] [输入文件]
    

    选项

    -n :仅打印模式匹配的行,常与 p 搭配使用
    -e :可进行多项编辑,即可对输入行使用多条 sed 命令,默认选项
    -f :将 sed 的动作写在一个脚本文件内,用 -f filename 参数执行 filename 内的 sed 动作
    -r :支持扩展表达式
    -i :直接修改文件内容,如 sed -i 's/old/new/g' demo.txt
    

    命令

    a \text:append 在指定行后追加文本 text,支持使用 \n 实现多行追加;
    i \text :insert 在指定行前插入文本 text,支持使用 \n 实现多行插入
    c \text:将指定行的内容替换为文本 text
    d :delete 删除匹配到的行
    p :print 显示匹配到的行,通常 p 会与参数 sed -n 搭配使用
    w /file:write 保存模式空间中匹配到的行至指定的文件中
    r /file :read 将指定文件的内容读取至当前模式空间中被匹配到的行后面,常用于实现文件合并
    sed  -i '/Ethernet/r myfile' test  匹配Ethernet的行,读进来另一个文件的内容,读进来的文件的内容会插入到匹配Ethernet的行后  
    s/pattern/replaces/:查找pattern用replaces替换,分隔符可自行指定,常用的分隔符有/, #, @等;
    替换标记:
          g : 全局替换;
          w /file : 将替换的结果保存至指定文件中;sed -i 's/pattern/replaces/w my.txt'  test    将替换后的结果保存到my.txt中
          p : 显示替换成功的行;
          y : 用于(对应)转换字符;
          = : 打印行号;
          ! : 匹配后取反;
          l : 打印行号,并显示控制字符;
          q : 读取匹配到的行后退出;
    

    应用

    • Demo Text
    [root@localhost ~]# nl /etc/passwd | head -n5> demo.txt
    [root@localhost ~]# cat demo.txt
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    • a \text(在指定行后新增)
    # 在第 2 行后新增一行且不改变源文件
    [root@localhost ~]# sed '2a CONSTANT DROPPING WEARS THE STONE!' demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    CONSTANT DROPPING WEARS THE STONE!
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    # 使用 \n 在第 2 行后新增多行且不改变源文件
    [root@localhost ~]# sed '2a CONSTANT DROPPING WEARS THE STONE! \nCONSTANT DROPPING WEARS THE STONE!' demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    CONSTANT DROPPING WEARS THE STONE! 
    CONSTANT DROPPING WEARS THE STONE!
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    [root@localhost ~]# cat demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
       
    # 使用 -i 选项,在第 2 后插入内容并改变源文件
    [root@localhost ~]# sed -i '2a CONSTANT DROPPING WEARS THE STONE!' demo.txt 
    [root@localhost ~]# cat demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    CONSTANT DROPPING WEARS THE STONE!
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    • i \text (在指定行前插入)
    # 在第 3 行前插入一行且不改变源文件
    [root@localhost ~]# sed '3i CONSTANT DROPPING WEARS THE STONE!' demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    CONSTANT DROPPING WEARS THE STONE!
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    # 使用 \n 插入多行且不改变源文件
    [root@localhost ~]# sed '3i CONSTANT DROPPING WEARS THE STONE!\nCONSTANT DROPPING WEARS THE STONE' demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    CONSTANT DROPPING WEARS THE STONE!
    CONSTANT DROPPING WEARS THE STONE
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    [root@localhost ~]# cat demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
        
    # 使用 -i 选项,在第 4 行前插入一行且改变源文件
    [root@localhost ~]# sed -i '4i CONSTANT DROPPING WEARS THE STONE!' demo.txt 
    [root@localhost ~]# cat demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
    CONSTANT DROPPING WEARS THE STONE!
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    • c \text 取代指定行的内容,同理,加 -i 选项会修改源文件
    # 替换 2-5 行之间的内容
    [root@localhost ~]# sed '2,5c  CONSTANT DROPPING WEARS THE STONE!' demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
    CONSTANT DROPPING WEARS THE STONE!
    
    • d :delete 删除匹配到的行
    # 删除第 3 行
    [root@localhost ~]# sed '3d' demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    # 删除 第 2~4 行
    [root@localhost ~]# sed '2,4d' demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    # 删除奇数行
    [root@localhost ~]# sed '1~2d' demo.txt 
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
    
    # 删除包含第 2 行后两行
    [root@localhost ~]# sed '2,+2d' demo.txt 
         1  root:x:0:0:root:/root:/bin/bash
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    
    # 删除指定关键词(adm)行
    [root@localhost ~]# sed '/adm/d' demo.txt
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    • p :print 显示匹配到的行,通常 p 会与参数 sed -n 搭配使用
    [root@localhost ~]#  sed -n '/daemon/p' demo.txt
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    • s/old/new/:查找 old 用 new 替换
    # 将 root 替换为 User
    [root@localhost ~]# sed 's/root/User/g' demo.txt
         1  User:x:0:0:User:/User:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    

    基础正则表达式字符

    字符 意义
    ^word 搜寻的字串(word)在行首行
    word$ 搜寻的字串(word)在行尾
    . 匹配一个非换行符的字符,空格也算字符 如:/s.d/匹配s后接一个任意字符,然后是d
    * 重复零个到无穷多个的前一个 RE 字符,* 之前必须要紧接着 一个 RE 字符
    \ 将特殊符号的特殊意义去除
    [list] 匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed
    [^list] 匹配一个不在指定范围内的字符,反选
    <word 匹配以 word 开始的行,如:/\<word/
    word> 匹配以 word 结束的行,如/word\>/
    x{m} 重复字符x,m次,如:/0{5}/匹配包含5个o的行
    x{m,} 重复字符x,至少m次,如:/o{5,}/匹配至少有5个o的行
    x{m,n} 重复字符x,至少m次,不多于n次,如:/o{5,10}/匹配5--10个o的行

    元字符应用

    • Demo txt
    [root@localhost ~]# ifconfig ens33
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 10.180.111.23  netmask 255.255.255.0  broadcast 10.180.111.255
            inet6 fe80::250:56ff:fe28:3506  prefixlen 64  scopeid 0x20<link>
            ether 00:50:56:28:35:06  txqueuelen 1000  (Ethernet)
            RX packets 63780  bytes 11329572 (10.8 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1789  bytes 132928 (129.8 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    • ^word 匹配所有以 空格开头的前两行
    [root@localhost ~]# ifconfig ens33 | sed -n '/^ /p'  | head -n 2
            inet 10.180.111.23  netmask 255.255.255.0  broadcast 10.180.111.255
            inet6 fe80::250:56ff:fe28:3506  prefixlen 64  scopeid 0x20<link>
    
    • word$ 匹配所有以 255 结尾的行
    [root@localhost ~]# ifconfig ens33 | sed -n '/^ /p' | head -n 2 | sed -n '/255$/p'
            inet 10.180.111.23  netmask 255.255.255.0  broadcast 10.180.111.255
    
    • . 匹配一个非换行符的字符 如:/r.r/匹配 r 后接一个任意字符,然后是 r
    [root@localhost ~]# ifconfig ens33 | sed -n '/r.r/p'
            RX errors 0  dropped 0  overruns 0  frame 0
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    • [list] 匹配一个指定范围内的字符
    [root@localhost ~]# ifconfig ens33 | sed -n '/[rt]s/p'
            RX packets 67344  bytes 11695515 (11.1 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1799  bytes 133756 (130.6 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    • [^list] 匹配一个不在指定范围内的字符
    [root@localhost ~]# ifconfig ens33 | sed -n '/inet[^6]/p'
            inet 10.180.111.23  netmask 255.255.255.0  broadcast 10.180.111.255
    

    -/ \<word/ 匹配以 word 开始的行

    [root@localhost ~]# ifconfig ens33 | sed -n '/\<ens33/p'
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    

    -/ word\>/ 匹配以 word 结束的行

    [root@localhost ~]# ifconfig ens33 | sed -n '/255\>/p'
            inet 10.180.111.23  netmask 255.255.255.0  broadcast 10.180.111.255
    
    • x{m} 重复字符x,m次,如:/r{5}/ 匹配包含 2 个 r 的行
    [root@localhost ~]# ifconfig ens33 | sed -n '/r\{2\}/p'
            RX errors 0  dropped 0  overruns 0  frame 0
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    • x{m,} 重复字符x,至少m次,如:/1{2,}/ 匹配至少有2 个 1 的行
    [root@localhost ~]# ifconfig ens33 | sed -n '/1\{2,\}/p'
            inet 10.180.111.23  netmask 255.255.255.0  broadcast 10.180.111.255
            RX packets 72499  bytes 12252286 (11.6 MiB)
    
    • 删除空白行
    # sed 's/^\s*$/d' test.txt
    # grep -v '^\s*$' test.txt
    # awk NF test.txt
    

    相关文章

      网友评论

          本文标题:sed 文本处理

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