sed是linux系统中一款功能强大的流编辑器,它可以逐行读取文本文件内容,按照用户指定的规则对内容进行处理后输出,无需直接修改原文件就能完成各类文本编辑操作,是运维和开发工作中常用的工具。

sed命令的基本语法
sed命令的通用语法格式如下:
sed [选项] '编辑命令' 文件名
常用的选项包括:
- -n:静默模式,只输出经过sed处理的内容,不输出原文件的所有行
- -i:直接修改原文件内容,而不是输出到终端
- -e:指定多个编辑命令,按顺序执行
- -f:从指定文件中读取编辑命令
常用编辑命令场景
1. 文本替换操作
替换是最常用的功能,语法为s/原字符串/新字符串/替换标记,替换标记常用g表示全局替换,否则只替换每行的第一个匹配项。
例如将test.txt文件中所有的hello替换为world,命令如下:
# 仅输出替换后的内容,不修改原文件 sed 's/hello/world/g' test.txt # 直接修改原文件 sed -i 's/hello/world/g' test.txt
2. 删除指定行
删除命令使用d标记,可以指定行号、行范围或者匹配规则来删除对应行。
# 删除第3行 sed '3d' test.txt # 删除第2到第5行 sed '2,5d' test.txt # 删除包含error关键字的所有行 sed '/error/d' test.txt
3. 插入和追加内容
i表示在指定行前插入内容,a表示在指定行后追加内容,格式为行号i插入内容或行号a追加内容。
# 在第2行前插入一行内容 sed '2i这是插入的新行' test.txt # 在第2行后追加一行内容 sed '2a这是追加的新行' test.txt # 在文件末尾追加内容 sed '$a文件末尾新增内容' test.txt
4. 打印指定行
结合-n选项和p标记,可以只打印匹配的行,避免输出所有内容。
# 只打印第5行内容 sed -n '5p' test.txt # 只打印包含warning关键字的行 sed -n '/warning/p' test.txt
结合正则表达式使用
sed支持正则表达式匹配,可以实现更灵活的文本处理,比如匹配数字、特定格式的内容等。
例如删除test.txt中所有以#开头的注释行:
sed '/^#/d' test.txt
再比如将文件中所有连续的数字替换为NUM:
sed 's/[0-9]+/NUM/g' test.txt
多命令组合使用
如果需要执行多个编辑操作,可以使用-e选项指定多个命令,或者用分号分隔多个命令。
# 先删除第1行,再将hello替换为world sed -e '1d' -e 's/hello/world/g' test.txt # 用分号分隔多个命令的写法 sed '1d;s/hello/world/g' test.txt
注意事项
- 使用-i选项修改原文件前,建议先备份原文件,避免误操作导致数据丢失
- 替换命令中的分隔符/可以换成其他字符,比如换成#,当处理的字符串中包含/时可以避免转义,例如
sed 's#/usr/local#/opt#g' test.txt - 不同linux发行版的sed版本可能存在细微差异,部分高级功能需要确认兼容性