一句话理解 sed
sed = 流编辑器:逐行读入、按规则加工、输出结果。它最经典的用途是不打开文件就完成替换——一条命令顶得上一百次 vim。
$ echo "port=8080" | sed 's/8080/9090/'
port=9090
# 默认只替换每行第一处,加 g 替换整行所有
$ sed 's/foo/bar/g' app.conf # 注意:此刻只输出到屏幕,文件没变s/旧/新/ 就是核心语法,所有记忆成本都在这一个模式上。
-i 落盘:先预览再动手
$ sed -i 's/8080/9090/g' application.properties # 真改文件
$ sed -i.bak 's/8080/9090/g' application.properties # 真改,并留 application.properties.bak铁律:去掉 -i 先跑一遍看输出,确认替换范围没错再加 -i;生产文件务必带 .bak。替换内容含 /(比如路径)时换个分隔符即可:sed 's|/usr/local|/opt/app|'。
按行号与正则定位
$ sed -n '10,20p' app.log # 只打印 10~20 行(-n 关默认输出,p 打印)
$ sed -n '/ERROR/p' app.log # 等价于 grep ERROR
$ sed '/^#/d' nginx.conf # 删除 # 开头的注释行
$ sed '/^$/d' data.txt # 删除空行
$ sed '3a listen 80;' nginx.conf # 在第 3 行之后追加一行(a = append)动作字母记四个就够:p 打印、d 删除、a 行后追加、i 行前插入。「清洗配置文件」的两板斧——去注释、去空行——就是上面两个 d。
实战:批量改 100 个配置文件的端口
# 第 1 步:先看会改到哪些文件(只找不改)
$ grep -rl "8080" /opt/app/conf/
# 第 2 步:确认列表无误,批量替换并留备份
$ grep -rl "8080" /opt/app/conf/ | xargs sed -i.bak 's/8080/9090/g'
# 第 3 步:复查替换结果
$ grep -rn "9090" /opt/app/conf/ | wc -lgrep -rl 找出含目标的文件列表,xargs 把列表交给 sed 批量执行——管道串三剑客的典型协奏,下一章就专门讲这条「流水线」的原理。
sed 与 vim 替换是亲戚
vim 里的 :%s/old/new/g 和 sed 的 s/old/new/g 语法几乎一致——vim 借的正是 sed 的表达式。区别只在:vim 改的是内存里的缓冲区,sed 直接改磁盘上的文件。三剑客到此集齐,下一篇讲它们的共同舞台:管道与重定向——Linux 的精髓全在组合。
评论 (0)