我有一大堆文件,我希望改变这样的东西:
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个其他版本。
必须有一些我不明白的事情......但是我完全不知道为什么没有什么工作。我也发生了一些滑稽的事情,比如当猫拿出文件时,它没有打印新行,只写了其余部分的写作。
有谁知道如何做到这一点?
答案 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行,并用空斜线替换空行。