sed - 流式编辑文本

sed 按脚本处理输入文本。默认将结果写到标准输出,不修改原文件,因此适合先预览转换结果。

常用参数

  • -e SCRIPT--expression=SCRIPT:添加处理脚本。
  • -f FILE--file=FILE:从文件读取处理脚本。
  • -n--quiet:关闭默认输出,只显示显式打印的内容。
  • -E--regexp-extended:使用扩展正则表达式。
  • -i[SUFFIX]--in-place[=SUFFIX]:原地修改;指定后缀时创建备份,这是 GNU sed 语法。

替换

# 每行只替换第一个 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;如果脚本没有显式输出,原文件可能被清空。
  • 修改配置文件前应验证匹配范围,不要把真实密码、令牌或内部地址写进示例和版本库。

参考资料