如何删除sed的双行换行符?

我试过了:

sed -i 's/\n+/\n/' file 

但它不工作。

我仍然想要单行换行。

input:

 abc def ghi jkl 

期望的输出:

 abc def ghi jkl 

 perl -00 -pe 1 filename 

将输入文件分割成由两个或多个换行符分隔的“段落”,然后打印由单个空白行分隔的段落:

 perl -00 -pe 1 <<END abc def ghi jkl END 
 abc def ghi jkl 

使用awk(gnu或BSD)你可以这样做:

 awk -v RS= -v ORS='\n\n' '1' file abc def ghi jkl 

还使用perl

 perl -pe '$/=""; s/(\n)+/$1$1/' file abc def ghi jkl 

Sed不是很擅长以编程的方式检查多行的任务。 这是我能得到的最接近的:

 $ sed '/^$/{n;/^$/d}' file abc def ghi jkl 

这个逻辑:如果你找到一个空行,看看下一行。 如果下一行也是空白的,删除下一​​行。

这不会吞噬所有的线路,因为它假设有一个有意的额外的配对,并把两个\n\n降到两个\n s。


要在基本awk做到这一点:

 $ awk 'NF > 0 {blank=0} NF == 0 {blank++} blank < 2' file abc def ghi jkl 

这使用了一个称为空白的变量,当字段数( NF )为非零时为零,当它为零时(一条空白行)增量。 当连续的空行数小于2时,Awk的默认行为是打印。

这给你什么你想单独使用sed:

 sed '/^$/d' txt | sed -e $'s/$/\\\n/' 

第一个sed命令删除所有空行,表示为“^ $”。

第二个sed命令在每行的末尾插入一个换行符。

这可能适用于你(GNU sed):

 sed '/^$/{:a;N;s/\n$//;ta}' file 

这将用一个空白行替换多个空白行。

但是,如果您想在每个非空行之后放置一个空行,则:

 sed '/^$/d;G' file 

其中删除所有空白行,只附加一个空白行到非空行。

为什么不摆脱所有的空白行,然后在每行之后添加一个空行? 对于您指定的输入文件tmp

 sed '/^$/d' tmp|sed '0~1 a\ ' abc def ghi jkl 

如果空格(空格和制表符)被视为“空白”行,则使用sed '/^\s*$/d' tmp|sed '0~1 a\ '

请注意,这些解决方案确实在最后留下了空行,因为我不确定是否需要这样做。 轻松删除。