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 @ 2023-05-06 14:37  瘦阿瘦  阅读(1031)  评论(0编辑  收藏  举报