なぜ2つ以上の空行を1つの空行に送信できないのですか?どのようなヒントがありますか?
echo -e "hello\n\n\nhello2" | sed 's/^$\n^$/\n/g'
hello
hello2
答え1
これが失敗する理由は、sed
複数行演算子を指定しない限り、ストリームで一度に1行しか実行できないためです。一度に1行のテキストしか表示されない場合は、複数の行の始まりと行末の^
演算子をこのように囲むことは意味がありません。$
複数の空行を折りたたむ最も簡単な方法は、cat
マンページで次を使用することです。
-s, --squeeze-blank は、
繰り返される空の出力ラインを抑制します。
仕組みは次のとおりです。
$ echo -e "hello\n\n\nworld" | cat -s
hello
world
空行を圧縮するのではなく完全に削除するには、次のようにしますgrep
。
$ echo -e "hello\n\n\nworld" | grep -v '^$'
hello
world
本当にこれを行うには、sed
複雑な式と操作を使用する必要があります。例を挙げましょう(ありがとうございます。フレッド)は、連続したスペースを必要な数だけ1つの空行に縮小します。
$ echo -e "hello\n\n\nworld" | sed -re '$!N;/^\n$/!P;D'
hello
world
cat -s
複数の空白行を縮小すると、なぜはるかに簡単なのかがわかります。
答え2
awk
より多くの制御を提供する子孫の別の方法は次のとおりです。
cat file | awk 'BEGIN {sp=0} \
{if (length($0)==1) {sp=sp+1} \
if (sp>=1&&length($0)==1) {
} else {
for (i=1;i<=((3<sp)?3:sp);i++) {print ""}
print $0; sp=0}
}'
これにより、空白行数(length($0)==1
)をより少なく圧縮できますが、必ずしもゼロである必要はありません(この場合は3行)。
したがって、1行、2行、3行のスペースは保持されますが、3行以上のスペースは常に3行に圧縮されます。
答え3
sed -e '/./b' -e :n -e 'N;s/\n$//;tn' infile