2

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

 BLah </V>
<N> Blah

这是我想将其转换为:

Blah" = "Blah

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

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

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

我的脚本哪里出错了?

4

2 回答 2

4

事情是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'
于 2013-02-15T09:00:43.090 回答
3

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

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

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

这种保持模式、子空间中的传输器缓冲区或任何所需的东西都没有——只需将记录分隔符设置为换行符以外的东西,并将多行字符串视为任何其他字符串。

于 2013-02-15T20:17:53.883 回答