bash - 为什么 sed 不替换这个换行符?

标签 bash sed

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

 BLah </V>
<N> Blah

这是我想要将其转换为的内容:

Blah" = "Blah

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

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

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

我的脚本哪里出了问题?

最佳答案

事情是 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'

关于bash - 为什么 sed 不替换这个换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14890987/

相关文章:

linux - 如何在 sed 中将方括号内的字母和数字替换为相同的数字和括号外的字母?

bash - 搜索并替换多次出现的情况

python - 用 SED 替换字符串

php - 通过 Bash 的 Mysql View 转储

linux - 将脚本作为 cron 作业运行不显示数据。

sed - 用awk交换两列

regex - sed:这个替换命令有什么问题?

linux - 将文件复制到子目录并重命名

linux - 如何在 linux makefile 中设置环境变量

php - 如何将 php 与 bash 脚本连接或将变量从 php 传递到 bash 脚本