이전 행에 패턴과 일치하는 행을 추가하는 방법

이전 행에 패턴과 일치하는 행을 추가하는 방법

전임자:

입력 파일

******************
.WER
+ aaa bbb ccc
+ ddd eee 
+ fff ggg hhh
******************
.SDF
+ zzz xxx yyy 
+ iii  
+ kkk lll
******************
.XCV
+ uuu vvv ggg 
+ hhh qqq 
+ rrr ttt jjj
******************

원하는 출력:

******************
.WER aaa bbb ccc ddd eee fff ggg hhh
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq rrr ttt jjj
******************

"+" 패턴과 일치하는 줄을 이전 줄에 추가하고 "+"를 공백으로 바꾸고 싶습니다.

누구든지 awk 또는 sed(또는 심지어 grep) 명령을 사용하여 이 문제를 해결할 수 있습니까?

저는 리눅스 초보자입니다. 전체 명령줄에 대해 자세히 설명해주세요.

답변1

질문에 /linux 태그를 지정했으므로 아마도 GNU를 사용하고 있을 것입니다 sed. 그런 다음 이 -z옵션을 사용하여 하나의 버퍼에서 전체 파일을 처리하고 다음을 사용할 수 있습니다 .

sed -z 's/\n+//g'

이는 뒤에 오는 s각 줄 바꿈 문자( )를 null로 바꾸는 것을 의미합니다. 즉, 이전 줄에서 시작하는 줄을 연결하고 .\n+++

답변2

나는 이것을 가지고 왔습니다 awk:

awk 'BEGIN {RS=""}{gsub(/\n\+/,"", $0); print $0}' file

산출:

******************
.WER aaa bbb ccc ddd eee  fff ggg hhh
******************
.SDF zzz xxx yyy  iii   kkk lll
******************
.XCV uuu vvv ggg  hhh qqq  rrr ttt jjj
******************

답변3

모든 UNIX 시스템의 모든 쉘에서 awk를 사용하면 한 번에 한 줄만 메모리로 읽습니다(지금까지 게시된 다른 솔루션은 전체 입력 파일을 한 번에 메모리로 읽습니다).

$ awk '{printf "%s%s", (sub(/^\+/,"") ? "" : ors), $0; ors=ORS} END{print ""}' file
******************
.WER aaa bbb ccc ddd eee fff ggg hhh
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq rrr ttt jjj
******************

관련 정보