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)
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 。
编辑它以提供更多错误更正。
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)
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)