sed 文本处理

2023-03-27  本文已影响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 : 读取匹配到的行后退出;

应用

[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
# 在第 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
# 在第 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
# 替换 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!
# 删除第 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
[root@localhost ~]#  sed -n '/daemon/p' demo.txt
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 将 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的行

元字符应用

[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
[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>
[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
[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
[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
[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
[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
[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
上一篇下一篇

猜你喜欢

热点阅读