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 的定位是“批量改文本的手术刀”:替换、删行、插行三板斧,配上地址范围,九成配置修改都不用开编辑器。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。






