将新行 + 4x 空格替换为标准输出中的新行

use*_*763 4 bash string text-processing

我需要将 2 行合并为一个stdout- 用一个空格替换新行和 4x 空格,但没有空格的新行不要触摸

tcpdump -vvv ... -l | xyz
Run Code Online (Sandbox Code Playgroud)

这是输出:

2014-06-06 AAA
    BBB
2014-06-06 CCC
    DDD
Run Code Online (Sandbox Code Playgroud)

但是我需要:

2014-06-06 AAA BBB
2014-06-06 CCC DDD
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

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

那应该适用于以下输入:

2014-06-06 AAA
    BBB
2014-06-06 CCC
    DDD
    EEE
2014-06-06 EEE
2014-06-06 FFF
Run Code Online (Sandbox Code Playgroud)

并产生:

2014-06-06 AAA BBB
2014-06-06 CCC DDD EEE
2014-06-06 EEE
2014-06-06 FFF
Run Code Online (Sandbox Code Playgroud)

perl

perl -0777 -pe 's/\n {4}/ /g'
Run Code Online (Sandbox Code Playgroud)

但这意味着首先在内存中输入 while 。


Fal*_*mes 5

编辑它以提供更多错误更正。

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
Run Code Online (Sandbox Code Playgroud)

我的新答案:

$ 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
Run Code Online (Sandbox Code Playgroud)

这似乎远优于我的旧答案:

$ sed '/^[^ ]/N;s/\n   //' foo
2014-06-06 AAA BBB
2014-06-06 CCC DDD
2014-06-06 EEE
2014-06-06 FFF
    GGG
Run Code Online (Sandbox Code Playgroud)

或者@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 
Run Code Online (Sandbox Code Playgroud)


gle*_*man 5

echo "2014-06-06 AAA
      BBB
2014-06-06 CCC
    DDD
" | paste - - | tr -s '[:blank:]' '[ *]'
Run Code Online (Sandbox Code Playgroud)
2014-06-06 AAA BBB
2014-06-06 CCC DDD
Run Code Online (Sandbox Code Playgroud)