应用实例
提取版本号
使用 sed
结合正则表达式提取指定文件中版本号信息。
示例:
-
使用
grep
命令提取包含数字和点号的行:grep -E "[0-9]+\." 1.txt
示例输出:
ant-1.9.7.jar ant-launcher-1.9.7.jar antlr-2.7.7.jar antlr-runtime-3.4.jar aopalliance-1.0.jar archaius-core-0.7.6.jar asm-5.0.4.jar aspectjweaver-1.9.5.jar
-
使用
sed
命令提取版本号:完整版替换,将每行的
-
和.jar
替换掉:cat 1.txt | sed -r 's/(.*)-(.*)(\.jar)/\1\2\3/'
取消
-
前面的内容,只保留-
后的内容:cat 1.txt | sed -r 's/.*-(.*)(\.jar)/\1\2/'
只提取版本号:
cat 1.txt | sed -r 's/.*-(.*)\.jar/\1/'
结果输出:
1.9.7 1.9.7 2.7.7 3.4 1.0 0.7.6 5.0.4 1.9.5
说明:
r
选项表示引用扩展正则,(.*)
表示 “-” 前面的所有内容,第二个(.*)
表示 “-” 后的内容直到.jar
。
查看指定时间内的日志
使用 sed
命令查看指定时间范围内的日志。
sed -n '/Mar 23 21:00:01/,/Mar 23 21:30:01/p' /var/log/messages
注意:开头的时间格式要一致,否则无法正确匹配。
输出示例:
Mar 23 21:00:01 localhost systemd: Started Session 70 of user root.
修改网卡的IP地址
使用 sed
命令修改网卡配置文件中的 IP 地址:
sed -i '/IPADDR=192.168.233.21/c IPADDR=10.10.10.10' ifcfg-ens33
查看结果:
cat ifcfg-ens33
TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.10.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.233.2
DNS1=192.168.233.2
注意: 在使用 sed
的 y
命令时,两边的字符串长度必须相等。如果不相等,会报错。
sed
中的 y
命令是逐字符替换,它会将左侧字符串的每个字符替换为右侧字符串的对应字符。
例如,y/abc/123/
会将 a
替换为 1
,b
替换为 2
,c
替换为 3
。两边字符串长度不同会导致 sed
无法确定该如何替换,因而报错。
# 错误示例:逐字符替换,报错
sed -i 'y/10.10.10.10/192.168.233.21/' ifcfg-ens33
sed: -e expression
#1,字符 29:“y”命令的字符串长度不同
# 正确示例:替换整个字符串而不是逐字符替换
sed -i 's/10.10.10.10/192.168.233.21/g' ifcfg-ens33
替换文件中URL指定内容
将文件中的URL(以“http://”或“https://”开头)替换为“链接”的格式。
原内容
cat file15.txt
https://www.baidu.com
ftp://20.0.0.111
https://www.xxx.cn
http://aaa.xyz
# 精确匹配后替换
sed -r 's#https?://[a-zA-Z0-9./=_-]*#链接#g' file15.txt
链接
ftp://20.0.0.111
链接
链接
# 匹配开头后整行替换
sed -r '/(http)|(https)/c 链接' file15.txt
链接
ftp://20.0.0.111
链接
链接
总结
sed
是一种流编辑器:逐行读取文件并执行指令操作。对于过大的文件,建议拆分后处理。sed -r
搭配扩展正则表达式使用:使用{n}
{n,}
{n,m}
等匹配时,不需要加转义符\
。- 使用
i
选项时需谨慎:对重要文件的操作前,先备份或在实验确认无误后再使用i
。 sed
命令的核心功能是增删改查:特别适用于脚本中对配置文件的修改和内容添加。