出于任何原因无法将 '\n' 替换为 '\\'

Can't replace '\n' with '\\' for whatever reason

我有一大堆文件,我想像这样更改:

My line of text

My other line of text

进入

My line of text\
My other line of text

看似简单,其实不然。我已经尝试了 sed s,"\n\n","\\\n", 以及 tr '\n' '\' 和这些命令的大约 20 个其他化身。

一定是发生了什么我不明白的事情...但我完全不知道为什么没有任何效果。我也发生了一些滑稽的事情,比如当输出文件时,它不打印换行符,只写在剩下的地方。

有谁知道如何做到这一点?

sed 在行上工作。它获取一行,将您的代码应用于它,获取下一行,等等。由于行是单独处理的,多行正则表达式并不那么容易工作。

为了在 sed 中使用多行正则表达式,您必须首先 assemble 模式 space 中的文件,然后对其进行处理:

sed ':a $!{ N; ba }; s/\n\n/\\\n/g' filename

这里的技巧是

:a $!{ N; ba }

其工作原理如下:

:a     # jump label for looping
$!{    # if the end of the input has not been reached
  N    # fetch the next line and append it to what we already have
  ba   # go to :a
}

一旦结束,整个文件都在模式 space 中,并且可以对其应用多行正则表达式。当然,这要求文件足够小,能装进内存。

sed 是面向行的,因此不适用于跨行的问题。你只需要使用像 awk:

这样的面向记录的工具
$ awk -v RS='^$' -v ORS= '{gsub(/\n\n/,"\\\n")}1' file
My line of text\
My other line of text

以上使用 GNU awk 进行多字符 RS。

这里有一个 awk 可以解决这个问题:

如果空行可以包含制表符或空格,则使用:

awk '!NF{a=a"//"} b{print a} {a=[=10=];b=NF} END {print a}' file
My line of text//
My other line of text

如果空行只是空空如也,应该这样做:

awk '!NF{a=a"//"} a!=""{print a} {a=[=11=]} END {print a}' file

这可能对你有用 (GNU sed):

sed 'N;s|\n$|//|;P;D' file

这会在任何时间点保留模式 space 中的 2 行,并用双斜杠替换空行。