표준 출력에서 ​​개행 + 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

관련 정보