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

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

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

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

相关内容