无法取代' \ n'用' \\'无论出于何种原因

时间:2015-02-23 19:25:34

标签: sed backslash tr

我有一大堆文件,我希望改变这样的东西:

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个其他版本。

必须有一些我不明白的事情......但是我完全不知道为什么没有什么工作。我也发生了一些滑稽的事情,比如当猫拿出文件时,它没有打印新行,只写了其余部分的写作。

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

4 个答案:

答案 0 :(得分:1)

sed在线上工作。它获取一行,将代码应用于它,获取下一行,等等。由于线条是单独处理的,因此多线复制不太容易。

为了在sed中使用多行正则表达式,你必须首先在模式空间中组装文件,然后对其进行处理:

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
}

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

答案 1 :(得分:0)

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。

答案 2 :(得分:0)

以下是解决此问题的awk

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

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

如果空白行只是空白,则应该执行以下操作:

awk '!NF{a=a"//"} a!=""{print a} {a=$0} END {print a}' file

答案 3 :(得分:0)

这可能适合你(GNU sed):

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

这样可以在任何时间点在模式空间中保留2行,并用空斜线替换空行。