Shell 四剑客之二:sed 流编辑器实战

sed 是流编辑器:批量改配置、替换文本、删行插行,不用打开编辑器。它按行读、按规则改、输出结果,适合写进脚本里自动化。这篇讲 sed 的替换、删行打印和批量改配置实战。

一、替换:s 命令是本命

# 替换每行第一个匹配
sed 's/old/new/' file.txt

# 全局替换(每行所有匹配)
sed 's/old/new/g' file.txt

# 原地修改文件(-i),改之前先备份
sed -i.bak 's/old/new/g' file.txt

# 分隔符不用非得是 /,路径里斜杠多就换成 | 或 #
sed 's|/old/path|/new/path|g' config.txt
sed 's#/usr/local#/opt#g' config.txt

分隔符换成 | 或 # 是 sed 最实用的小技巧,改路径、改 URL 时不用满屏转义。

二、删行与打印

# 删掉空行
sed '/^$/d' file.txt

# 删掉注释行(以 # 开头的行)
sed '/^#/d' file.txt

# 只打印第 10 到 20 行
sed -n '10,20p' file.txt

# 只打印匹配的行
sed -n '/ERROR/p' app.log

# 删掉第 1 行(比如去掉表头)
sed '1d' data.csv

-n 加 p 是“只输出我想要的行”,不加 -n 的 p 会把匹配行打印两遍,新手最容易在这里翻车。

三、插入与追加

# 在匹配行的后面加一行
sed '/^server {/a\    listen 8080;' nginx.conf

# 在匹配行的前面加一行
sed '/^# End/i\# Added by ops' file.txt

# 在文件末尾加一行
sed '$a\export PATH=/opt/bin:$PATH' .bashrc

四、实战:批量改配置

# 批量改 license 服务器地址(先备份,再改,再验证)
cp license.dat license.dat.bak
sed -i 's/27000@old-lic/27000@new-lic/g' license.dat
grep "SERVER" license.dat

# 注释掉某一行(行首加 #)
sed -i 's/^\(max_connections.*\)/#\1/' my.cnf

# 批量替换多个文件里的同一个字符串
grep -rl "old-host" /eda/conf/ | xargs sed -i 's/old-host/new-host/g'

# 只改某一行区间里的内容(第 5 到第 10 行)
sed -i '5,10s/debug/info/g' app.conf

五、坑

  • 特殊字符:& 在替换结果里代表“整个匹配”,想写 & 本身要转义成 \&;/ 用别的分隔符绕开。
  • -i 先备份:原地修改没有后悔药,重要文件先 -i.bak,验证通过再删备份。
  • macOS 和 GNU sed 差异:macOS 的 -i 后面必须跟备份后缀(哪怕是空字符串),GNU 的不用,脚本跨平台要留意。
  • 贪婪匹配:.* 是贪婪的,s/<.*>// 会把一行里所有的尖括号内容全吃掉,必要时用 [^>]* 限制。

sed 的定位是“批量改文本的手术刀”:替换、删行、插行三板斧,配上地址范围,九成配置修改都不用开编辑器。

发表回复

后才能评论