在Linux中,sed命令可基于模式匹配过滤及修改文本文件,采用非交互式逐行处理;可实现对文本的增、删、改、查等操作。
sed命令语法格式:
前置命令 | sed [选项] '条件指令'
sed [选项] '条件指令' 文件
sed命令常用选项:
-n:屏蔽默认输出,默认sed会输出读取文档的全部内容
-r:让sed支持扩展正则(不使用-r选项,sed支持基本正则)
-i:sed直接修改源文件,默sed只是通过内存临时修改文件,源文件无影响
sed条件指令:
p:打印行,通常与选项 -n 结合使用;
d:删除行
s:替换匹配的字符
a:新增行,在指定的行之后追加文本
i:在指定的行之前插入文本
c:替换指定的行
sed命令条件指令p
# sed -n 'p' /etc/passwd //输出所有行,等同于cat /etc/passwd
# sed -n '4p' /etc/passwd //输出第4行
# sed -n '4,10p' /etc/passwd //输出第4~10行
# sed -n '4p;10p' /etc/passwd //输出第4行和第10行
# sed -n '4,+10p' /etc/passwd //输出第4行及其后的10行内容
# sed -n '/^bin/p' /etc/passwd //输出以bin开头的行
# sed -n '$=' /etc/passwd //输出文件的行数,$最后一行的行号
# sed -n '/bin/ =' /etc/passwd //输出所有包含bin的行号
sed命令条件指令d(复制/etc/passwd到/root目录下,避免错误参数系统文件)
# sed -i '4,10d' /root/passwd //删除第3~10行
# sed -i '/nologin/d' /root/passwd //删除所有包含nologin的行
# sed -i '/nologin/!d' /root/passwd //删除不包含nologin的行,! 符号表示取反
# sed -i '/^root/d' /root/passwd //删除以root开头的行
# sed -i '$d' /root/passwd //删除文件的最后一行,$表示最后一行
# sed -i '/^$/d' /root/passwd //删除所有空行
# sed -i 'd' /root/passwd //删除所有行,即清空文件
sed命令条件指令s sed -i ‘s/旧内容/新内容/选项’ 文件
新建一个文件来测试条件指令s;仅做演示时,可不用 -i 选项
# vim seds.txt
abc abc abc
qwe abc qwe
abc qwe abc
# sed 's/abc/2019/' seds.txt //将每行中第一个abc替换为2019
# sed 's/abc/2019/3' seds.txt //将每行中的第3个abc替换为2019
# sed 's/qwe/2019/g' seds.txt //将所有的qwe都替换为qwe
# sed 's/qwe//g' seds.txt //将所有的qwe都替换为空,即删除所有的qwe
sed修改配置文件
# sed -i 's/nologin//g' /root/passwd //将所有的nologin都删除(替换为空串)
# sed '4,10s/^/#/' /root/passwd //在第4~10行首字符前添加#号,即注释第4~10行
# sed -i "/^#anon/s/^#//" /etc/vsftpd/vsftpd.conf //修改服务配置,删除注释,开启匿名上传
替换操作的分隔“/”可改用其他字符,如#、&等,便于修改文件路径
# sed -i 's#/bin/bash#/sbin/sh#g' /root/passwd //将/bin/bash替换为/sbin/sh
sed结合正则,实现字符位置的替换
( \ )()括起来的被保存下来,粘贴时用数字表示保存的第几个,括号内的内容复制下来,用 \数字 粘贴,如 \3\2\1
# sed -r -i 's/^(.)(.*)(.)$/\3\2\1/' seds.txt #将文件中每行的第一个、倒数第1个字符互换
# sed 's/.//3 ; s/.$//' seds.tx #删除文件中每行的第三个、最后一个字符