標準出力で改行+ 4xスペースを改行に置き換え

標準出力で改行+ 4xスペースを改行に置き換え

2行を1行にマージする必要がありますstdout。新しい行をスペース1つとスペース4つに置き換えます。空白のない新しい行に触れないでください。

tcpdump -vvv ... -l | xyz

出力は次のとおりです。

2014-06-06 AAA
    BBB
2014-06-06 CCC
    DDD

しかし、私は以下が必要です:

2014-06-06 AAA BBB
2014-06-06 CCC DDD

答え1

より多くのエラー修正を提供するためにこれを編集しました。

sedの「N」コマンドは、次の行を追加します。改行と複数のスペースを変更するには、これを置き換えて使用します。

$ cat foo | sed 's/^/    /'
2014-06-06 AAA
    BBB
2014-06-06 CCC
    DDD
2014-06-06 EEE
2014-06-06 FFF
    GGG

私の新しい答え:

$ sed ':a;$!{N;s/\n   //;ba;}' foo
2014-06-06 AAA BBB
2014-06-06 CCC DDD
2014-06-06 EEE
2014-06-06 FFF GGG

これは以前の答えよりはるかに優れているようです。

$ sed '/^[^ ]/N;s/\n   //' foo
2014-06-06 AAA BBB
2014-06-06 CCC DDD
2014-06-06 EEE
2014-06-06 FFF
    GGG

または@mikeservがリストした美しいもの。

$ sed -n 'h;n;H;x;s/\n */ /p' foo
2014-06-06 AAA BBB
2014-06-06 CCC DDD
2014-06-06 EEE 2014-06-06 FFF
    GGG 

答え2

awk -v ORS= '/^ {4}/{print substr($0,4); next}
     {print s $0; s="\n"}
     END{print s}'

この入力は次の入力で機能する必要があります。

2014-06-06 AAA
    BBB
2014-06-06 CCC
    DDD
    EEE
2014-06-06 EEE
2014-06-06 FFF

そして以下を作ります:

2014-06-06 AAA BBB
2014-06-06 CCC DDD EEE
2014-06-06 EEE
2014-06-06 FFF

そしてperl

perl -0777 -pe 's/\n {4}/ /g'

しかし、これは最初にメモリからwhile入力を消費することを意味します。

答え3

echo "2014-06-06 AAA
      BBB
2014-06-06 CCC
    DDD
" | paste - - | tr -s '[:blank:]' '[ *]'
2014-06-06 AAA BBB
2014-06-06 CCC DDD

答え4

もう一つのawkコマンドは、

$ awk '{var=$0; getline; print var,$1}' file
2014-06-06 AAA BBB
2014-06-06 CCC DDD

関連情報