我需要将 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