使用sed命令替换多行

时间:2015-01-14 15:28:32

标签: linux 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'

你能帮助我解决上述命令的错误吗?

3 个答案:

答案 0 :(得分:1)

Sed逐行处理输入文件。所以不能像上面那样做。您需要包含N,以便将下一行附加到模式空间中。

$ sed 'N;s~ab\ncd~ab\n~g' file
ab

ef

答案 1 :(得分:1)

问题在于,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打印整个模式空间。

答案 2 :(得分:0)

其他几个选项:

perl -i -0pe 's/^ab\n\Kcd$//mg' file.log

将更改文件中的任何此类模式

如果只有一个,那么好ed

ed file.log <<END_SCRIPT
/^ab$/+1 c

.
wq
END_SCRIPT