なぜ2つ以上の空行を1つの空行に送信できないのですか?

なぜ2つ以上の空行を1つの空行に送信できないのですか?

なぜ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

関連情報