用 sed 快速批量替换文本:从简单替换到原地改文件
在 Linux 服务器上改配置,最怕的就是一个个文件手动打开、逐行替换。sed 是专门做流式文本替换的工具,一行命令就能批量改完,还能先预览、确认无误再落盘,是运维和开发都值得掌握的基本功。
最常见的用法是替换。sed 's/旧内容/新内容/' file 只替换每行第一次出现的地方;加上 g 标志,sed 's/旧内容/新内容/g' file 才会替换一行里的全部出现。默认情况下 sed 只是把结果打印到屏幕,并不会改原文件,这正是它安全的地方:先看输出,确认替换结果符合预期,再决定是否写入。
确认无误后,用 -i 选项做原地修改:sed -i 's/旧内容/新内容/g' file。改重要配置文件之前,建议先加备份后缀,例如 sed -i.bak 's/旧内容/新内容/g' nginx.conf,这样原文件会自动存为 nginx.conf.bak,改错了也能立刻恢复。这个习惯在生产环境尤其重要,不要等到改坏了才后悔没有备份。
分隔符不一定非用斜杠。当要替换的内容本身含有斜杠(比如路径 /var/www/html)时,写成 s/旧/新/ 会满是转义符,很容易看错。sed 允许换分隔符,例如 sed 's|/var/www/html|/srv/www|g' file,用竖线代替斜杠,命令立刻清爽很多。分隔符可以是 #、@、| 等,选一个内容里不出现的字符即可。
按行号限定范围也很实用。sed '2s/旧/新/' file 只改第 2 行;sed '10,20s/旧/新/g' file 只改第 10 到 20 行。结合地址匹配,还能只在包含某个关键字的行里替换:sed '/error/s/旧/新/g' file。范围越小,误伤的可能性越低。
删除行同样简单。sed '/关键字/d' file 会删掉所有包含关键字的行;sed '1d' file 删首行。删除和替换一样,默认不改原文件,确认后再加 -i。
最后提醒两点避坑经验。第一,替换内容里如果有 & 符号,sed 会把它理解为“整个匹配到的原文”,想写字面 & 需要转义成 \&。第二,批量改多个文件时可以用通配符,例如 sed -i 's/旧/新/g' *.conf,但改之前务必先用不带 -i 的版本在一两个文件上预览结果。
总结一下工作流:先不带 -i 预览、确认范围和结果、加 .bak 备份再原地修改、改完用 grep 或 diff 复核。掌握这套流程,批量改配置就不再是提心吊胆的手工活,而是一条命令就能放心执行的操作。
- 点赞
- 收藏
- 关注作者
评论(0)