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"字符串;最后输出替换后的结果。