我有一些用来记笔记的文本文件 - 只是纯文本,通常只使用cat >> file
.有时我会使用一两行空行(只需返回 - 换行符)来指定新的主题/思路。在每个会话结束时,在使用Ctrl+关闭文件之前D,我通常会添加大量(5-10)个空行(回车键)以分隔会话。
这显然不是很聪明,但它对我来说很有用。我做然而最终会出现很多不必要的空行,所以我正在寻找一种方法来删除(大部分)多余的行。是否有可以通过几个选项直接使用的 Linux 命令(剪切、粘贴、grep...?)?或者,是否有人知道 sed、awk 或 perl(实际上可以在任何脚本语言中使用,尽管我更喜欢 sed 或 awk)脚本来完成我想要的事情?用 C++ 写一些东西(我实际上可以自己做),看起来有点大材小用。
情况#1:我需要的是一个脚本/命令,它可以删除两个以上(3 个或更多)连续的空白行,并用两个空白行替换它们。不过,如果还可以对其进行调整以删除多于一行(2 或更多)和/或仅用一个空行替换多个空行,那就太好了。
案例#2:我还可以使用脚本/命令来删除单身的两行文本之间有一个空行,但保留多个空行(尽管删除其中一个空行也是可以接受的)。
答案1
情况1:
awk '!NF {if (++n <= 2) print; next}; {n=0;print}'
案例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}'
答案2
您可以使用uniq
将多个空行实例折叠为一个空行,但如果包含文本的行相同且位于彼此下方,它也会折叠包含文本的行。
答案3
情况1:
perl -i -ane '$n=(@F==0) ? $n+1 : 0; print if $n<=2'
案例2:
perl -i -ane '$n=(@F==0) ? $n+1 : 0; print $n==2 ? "\n$_" : $n==1 ? "" : $_ '
答案4
下列的安东建议使用“uniq”...
删除前导、尾随和重复的空白行。
# Get large random string.
rand_str=; while [[ ${#rand_str} -lt 40 ]]; do rand_str=$rand_str$RANDOM; done
# Add extra lines at beginning and end of stdin.
(echo $rand_str; cat; echo $rand_str) |
# Convert empty lines to random strings.
sed "s/^$/$rand_str/" |
# Remove duplicate lines.
uniq |
# Remove first and last line.
sed '1d;$d' |
# Convert random strings to empty lines.
sed "s/$rand_str//"
在一长串中:
(rand_str=; while [[ ${#rand_str} -lt 40 ]]; do rand_str=$rand_str$RANDOM; done; (echo $rand_str; cat; echo $rand_str) | sed "s/^$/$rand_str/" | uniq | sed '1d;$d' | sed "s/$rand_str//")
或者只使用“cat -s”。
我从括号换成大括号以保留在当前 shell 上下文中我认为这更有效率。请注意,大括号在最后一个命令后需要分号,并且需要一个空格来分隔。
# Add extra blank lines at beginning and end.
# These will be removed in final step.
{ echo; cat; echo; } |
# Replace multiple blank lines with a single blank line.
cat -s |
# Remove first and last line.
sed '1d;$d'
在一行中。
{ { echo; cat; echo; } | cat -s | sed '1d;$d'; }