Baa*_*rud 15 scripting sed awk perl filter
我有一些用于做笔记的文本文件 - 只是纯文本,通常只使用cat >> file. 有时我会使用一两个空行(只需返回 - 换行符)来指定一个新的主题/思路。在每个会话结束时,在使用Ctrl+关闭文件之前D,我通常会添加大量 (5-10) 空行(返回键)以分隔会话。
这显然不是很聪明,但它为此目的对我有用。我做不过最终了很多很多不必要的空行,所以我在寻找一种方式来删除(大部分)的额外线。是否有一个 Linux 命令(剪切、粘贴、grep、...?)可以直接与几个选项一起使用?或者,是否有人对 sed、awk 或 perl(实际上是任何脚本语言,尽管我更喜欢 sed 或 awk)脚本有什么想法可以做我想做的事?用 C++ 写一些东西(我实际上可以自己做),看起来有点矫枉过正。
案例#1:我需要的是一个脚本/命令,它可以删除两个以上(3 个或更多)连续的空行,并将它们替换为两个空行。虽然如果它也可以调整以删除多于一行(2 或更多)和/或仅用一个空行替换多个空行,那就太好了。
案例#2:我也可以使用一个脚本/命令来删除两行文本之间的单个空行,但保留多个空行(尽管删除其中一个空行也是可以接受的)。
Sté*_*las 15
情况1:
awk '!NF {if (++n <= 2) print; next}; {n=0;print}'
Run Code Online (Sandbox Code Playgroud)
案例2:
awk '!NF {s = s $0 "\n"; n++; next}
{if (n>1) printf "%s", s; n=0; s=""; print}
END {if (n>1) printf "%s", s}'
Run Code Online (Sandbox Code Playgroud)
情况1:
perl -i -ane '$n=(@F==0) ? $n+1 : 0; print if $n<=2'
Run Code Online (Sandbox Code Playgroud)
案例2:
perl -i -ane '$n=(@F==0) ? $n+1 : 0; print $n==2 ? "\n$_" : $n==1 ? "" : $_ '
Run Code Online (Sandbox Code Playgroud)
您可以使用 GNU sed 解决案例#1:
sed -r ':a; /^\s*$/ {N;ba}; s/( *\n *){2,}/\n\n/'
Run Code Online (Sandbox Code Playgroud)
也就是说,收集模式空间中的空行,如果有超过三行或更多行,则将其减少到两行。
要连接单行行,如案例#2 所示,您可以这样做:
sed -r '/^ *\S/!b; N; /\n *$/!b; N; /\S *$/!b; s/\n *\n/\n/'
Run Code Online (Sandbox Code Playgroud)
或者以注释的形式:
sed -r '
/^ *\S/!b # non-empty line
N #
/\n *$/!b # followed by empty line
N #
/\S *$/!b # non-empty line
s/\n *\n/\n/ # remove the empty line
'
Run Code Online (Sandbox Code Playgroud)