使用sed命令替换多行

穆拉利萨兰·佩鲁马尔

我有一个文本文件file.log包含以下文本

file.log

ab
cd
ef

我想将“ ab \ ncd”替换为“ ab \ n”,最终的file.log应该如下所示:

ab

ef

这是我正在使用的sed命令,但无法识别换行符以匹配模式:

sed -i 's/\(.*\)\r   \(.*\)/\1\r/g' file.log

'\ r'之后有3个字符的空格,但是对此没有任何改变。

\(.*\)-匹配任何字符(。),后跟0个或多个(*)前一个字符\r-对于换行符\1-替换第一个匹配模式。在这种情况下,它是“ ab”

您能帮我解决以上命令的问题吗?

nu11p01n73R

问题是,它sed是一个流编辑器,它从输入文件中逐行读取

所以当它读线

ab

从输入文件中,它不知道行后是否有一行

cd

当它读取行时,cd它会ab从模式空间中删除该行,从而使该模式对于当前模式空间无效。

解决方案

一种解决方案是读取整个文件,然后将它们附加到容纳空间中,然后替换容纳空间。作为

$ sed -n '1h; 1!H;${g;s/ab\ncd/ab\n/g;p}' input
ab

ef

它能做什么

  • 1h 将第一行复制到保留空间。

  • 1!H所有行都取代第一行(1!),将行追加到保留空间。

  • $ 匹配最后一行,执行命令 {..}

  • g 将保留空间的内容复制回模式空间

  • s/ab\ncd/ab\n/g 进行替换。

  • p 打印整个图案空间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章