sed 入门:用流编辑器批量改配置,不用一个个打开文件
要把几十个配置文件里的旧域名换成新域名,一个个打开改,改到天黑也改不完。sed 就是为这种活生的:它是 Linux 自带的流编辑器,按行读文本、按指令处理、再输出结果,不用打开编辑器就能批量改文件。
先理解 sed 的工作方式。它一次读入一行,对这一行执行你给的指令,然后输出,再读下一行。默认情况下它只改输出、不动原文件,想直接改文件要加 -i 参数。这个默认很安全:先在屏幕上看效果,确认没错再写回文件。
最常用的指令是替换,写法是 s/旧内容/新内容/。比如要把配置文件里的旧域名换掉:
sed 's/旧域名/新域名/' config.txt
这样只替换每行第一次出现的位置。想一行里出现的全部换掉,在末尾加 g:
sed 's/旧域名/新域名/g' config.txt
注意,到这一步原文件还没变,屏幕上显示的是改完的样子。确认无误后加 -i 写回:
sed -i 's/旧域名/新域名/g' config.txt
第一次用 -i 建议带上备份:sed -i.bak 会先把原文件存成 config.txt.bak,再改原文件,改错了还能找回来。
如果要替换的内容本身含有斜杠,比如网址,斜杠定界符会打架。sed 允许换定界符,用 # 或竖线都行:
sed 's#http://旧地址#http://新地址#g' config.txt
意思完全一样,读起来却清爽得多。
替换可以只针对某些行。只改第 3 行:
sed '3s/旧内容/新内容/' config.txt
只改包含某个关键词的行:
sed '/关键词/s/旧内容/新内容/g' config.txt
只看某几行也很常用。-n 加 p 是打印指定行,查日志时经常用:
sed -n '10,20p' app.log
这行命令只输出第 10 到第 20 行,不用把几千行日志全翻一遍。
删除行用 d。删掉所有含调试字样的行:
sed '/调试日志/d' app.log
多个操作可以一次写完,用 -e 连接:
sed -e 's/旧域名/新域名/g' -e '/调试日志/d' config.txt
sed 很适合放在管道中间。先用 cat 或 tail 取出日志,再用 sed 清洗,最后交给 grep 或其他工具:
tail -n 200 app.log | sed 's/旧域名/新域名/g' | grep 错误
几条容易踩的坑值得记下来。第一,替换内容里的 & 在 sed 里有特殊含义,代表匹配到的原文,想写一个真正的 & 要写成 \&。第二,正则里的点号、星号这些字符同样有特殊含义,匹配普通文本时要转义。第三,-i 是直接改文件,操作前先在不加 -i 的情况下看一遍输出,养成这个习惯能少很多麻烦。
练三个小任务就算入门了:把一份配置里的端口号 8080 批量改成 9090;从日志里只打印出含错误的行号前后各五行之外的指定行段;删掉配置文件里所有以 # 开头的注释行。做完这三个,日常批量改配置、清洗日志这类活,基本不用再一个个打开文件了。
- 点赞
- 收藏
- 关注作者
评论(0)