sed 多行条件匹配修改

cat test
111
222
333
---
---
111
222
333
---
111
333
---
111
222

需要将

111

222

333

替换成

444

555

666

使用sed命令

sed -n '1h;1!H;${g;s/111.222.333/444\n555\n666/g;p}' test
444
555
666
---
---
444
555
666
---
111
333
---
111
222

如写回文件可使用sed -n '1h;1!H;${g;s/111.222.333/444\n555\n666/g;p}' test>test.1&&mv test.1 test

解释:

  • -n:表示关闭默认的输出,只输出指定的内容。
  • 1h:表示将第一行的内容保存到sed缓冲区(pattern space)中,即把第一行作为模式空间。
  • 1!H:表示对非第一行的行,追加到缓冲区的末尾,即对第二行及以后的行,使用“H”命令将它们追加到模式空间的末尾。
  • ${}:表示到文件结尾为止。
  • g:表示将模式空间的内容拷贝至保持空间。
  • s:表示替换操作,将模式空间中的"111.222.333"替换为"444\n555\n666",其中“.”用来匹配空格或者换行符。
  • p:表示输出模式空间的内容。

因此,上述命令的含义是:首先将第一行保存到模式空间中,然后将后面的所有行追加到缓冲区的末尾,并且将所有行合并到模式空间中;然后对模式空间中的内容进行查找和替换,将其中所有的"111.222.333"字符串替换为"444\n555\n666"字符串;最后输出替换后的结果。

posted @   瘦阿瘦  阅读(1094)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示