我有一些数据,我想保留多个空行并仅删除单个空白行。我的数据如下所示:
1
2
3
4
5
6
7
8
9
10
我希望输出为:
1
2
3
4
5
6
7
8
9
10
我尝试过使用以下命令,但我似乎无法使用它:
awk ' /^$/ { print; } /./ { printf("%s ", $0); }'
并且
sed 'N;/^\n$/d;P;D'
另外,我尝试使用cat -s
,但这并不一定要删除空白行。此外,我玩sed '/^$/'
但不能指定单行。任何帮助是极大的赞赏。
答案 0 :(得分:6)
使用gnu-awk非常简单:
awk -v RS='\n+' '{printf "%s", $0 (length(RT) != 2 ? RT : "\n")}' file
1
2
3
4
5
6
7
8
9
10
-v RS='\n+'
我们将1个或多个换行符作为记录分隔符length(RT)
我们检查每条记录后的换行符数RT
length != 2
(原始捕获值)
备用awk
命令:
awk -v RS='\n{3,}' '{gsub(/\n{2}/, "\n", $0); printf "%s", $0 RT}' file
答案 1 :(得分:2)
使用GNU sed(BSD / OSX需要的小修改):
$ sed -E ':a; N; $!ba; :b; s/([^\n])\n\n([^\n])/\1\n\2/g; tb' input
1
2
3
4
5
6
7
8
9
10
:a; N; $!ba
立即阅读整个文件。
此处,a
是一个标签。 N
读入下一行。 $!ba
分支回标签,除非我们在最后一行。
:b; s/([^\n])\n\n([^\n])/\1\n\2/g; tb
用单个换行符替换双换行符。根据需要重复。
此处b
是一个标签。 s
命令删除双换行符。如果删除了任何双重换行符,则tb
会转回标签b
。
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed '/\S/!b;n;N;/^\s*\n\s*\S/D' file
如果一行是空的,请将其打印出来。否则,打印该行并获取接下来的两行,如果其中第一行为空但第二行不为,则删除第一行并重复。