为什么sed没有替换这个换行符呢?

时间:2013-02-15 08:51:10

标签: bash sed

我在Ubuntu的Bash shell中使用sed来替换某些文件中的文本。这是我的文字:

 BLah </V>
<N> Blah

以下是我要将其转换为:

Blah" = "Blah

这是我正在使用的sed命令:

sed -i 's@ </V>\n<N> @" = "@g'

我的所有其他sed命令都在工作,除了这个命令。这是唯一涉及换行符的搜索和替换情况。问题似乎是\n与我认为应该的新行字符不匹配。

我的剧本哪里出错?

2 个答案:

答案 0 :(得分:3)

问题是sed逐行处理文本。它同时没有在其缓冲区(称为模式空间)中的两条线。您可以通过调整脚本来修复它:

sed 'N;s@ </V>\n<N> @" = "@g'

来自man sed

   n N    Read/append the next line of input into the pattern space.

这是N的作用:将下一行追加到模式空间。然后替换工作。

示例:

$ sed 'N;s@ </V>\n<N> @" = "@g' <<<' BLah </V>
<N> Blah'
 BLah" = "Blah

然而,这将有50%的可能性不起作用,具体取决于模式是在输入中的偶数行还是奇数行开始。要解决这个问题,您可以像这样修改脚本:

sed 'N;s@ </V>\n<N> @" = "@g;P;D'

答案 1 :(得分:3)

sed是在单行上进行简单替换的优秀工具,对于任何其他文本处理只需使用awk:

$ cat file
Blah </V>
<N> Blah

$ awk -v RS= 'sub(/ <\/V>\n<N> /,"\" = \"")' file
Blah" = "Blah

这些保持模式,子空间中的传输缓冲区或者所需的任何东西都没有 - 只需将记录分隔符设置为换行符之外的其他内容,并像对待任何其他字符串一样处理多行字符串。