我试过了:
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\ '
。
请注意,这些解决方案确实在最后留下了空行,因为我不确定是否需要这样做。 轻松删除。