sed - 流式编辑文本
sed 按脚本处理输入文本。默认将结果写到标准输出,不修改原文件,因此适合先预览转换结果。
常用参数
-e SCRIPT、--expression=SCRIPT:添加处理脚本。-f FILE、--file=FILE:从文件读取处理脚本。-n、--quiet:关闭默认输出,只显示显式打印的内容。-E、--regexp-extended:使用扩展正则表达式。-i[SUFFIX]、--in-place[=SUFFIX]:原地修改;指定后缀时创建备份,这是 GNUsed语法。
替换
# 每行只替换第一个 old
sed 's/old/new/' input.txt
# 替换每行全部匹配
sed 's/old/new/g' input.txt
# 只处理包含 enabled 的行
sed '/enabled/s/false/true/g' input.txt
# 路径中包含斜杠时可换用其他分隔符
sed 's#/old/path#/new/path#g' input.txt替换部分常用标记:
g:替换一行中的全部匹配。p:输出发生替换的行,通常配合-n。&:在替换文本中代表整个匹配结果。\1、\2:代表正则捕获组。
sed -n 's/error/ERROR/gp' input.txt
sed -E 's/^([^=]+)=(.*)$/key=\1 value=\2/' input.txt按行处理
# 显示第 5 到第 10 行
sed -n '5,10p' input.txt
# 删除第 2 到第 5 行,仅输出结果
sed '2,5d' input.txt
# 删除空行或只包含空白的行
sed '/^[[:space:]]*$/d' input.txt
# 在第一行前插入标题(GNU sed)
sed '1i\Title' input.txt安全地修改文件
先不使用 -i 检查输出:
sed 's/old/new/g' config.example确认无误后,使用备份后缀原地修改:
sed -i.bak 's/old/new/g' config.example注意:
- GNU、BSD 和 macOS 的
-i参数语法不同,可移植脚本应先确认目标系统。 -i不带后缀时不会保留备份。- 不要随意组合
-n与-i;如果脚本没有显式输出,原文件可能被清空。 - 修改配置文件前应验证匹配范围,不要把真实密码、令牌或内部地址写进示例和版本库。