전임자:
입력 파일
******************
.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
******************