出于任何原因无法将 '\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 行,并用双斜杠替换空行。
我有一大堆文件,我想像这样更改:
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 行,并用双斜杠替换空行。