셸 스크립트는 단일 또는 여러 줄에 있는 시작 및 끝 매개변수를 기반으로 한 줄 출력을 인쇄합니다.

셸 스크립트는 단일 또는 여러 줄에 있는 시작 및 끝 매개변수를 기반으로 한 줄 출력을 인쇄합니다.

내 파일은 다음과 같습니다

"abc"..,,xyz 123 "New york".."END" <- # Print this entire line as starts with " and ends with "END"
"mnh".....blahblah                 <- # dont print this line and hold til "END" is
"rew"..?/.."1324.75 United            # found and once it is found, merge multi-
 States"??..."END"                    # lines to single line without changes

원하는 출력:

"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah"rew"..?/.."1324.75 United States"??..."END"    

sed모든 작업을 수행하기 위해 다음을 찾았습니다.시작 모드"종료 모드as 로 시작하지만 여기서 "END"중간 줄이 시작되면 끊어집니다 .""rew"종료 모드찾을 수 있습니다.

sed -n '/^"/,/^"END"/{
        //!{H;/{x;s/\n\([^\n]*\)$/\1/;x}};
        /^"/{h};/"END"/{x;p};d
        }' file

관련된:두 패턴 사이에 있는 각 레코드의 데이터 사이에서 줄바꿈을 어떻게 제거할 수 있나요?

답변1

awk -v RS='"END"\n' -v FS='\n' -v ORS='"END"\n' -v OFS=' ' '{ $1=$1 };1' file

또는 이에 상응하는

awk 'BEGIN { ORS=RS="\"END\"\n"; FS="\n" } { $1 = $1 }; 1' file

OFS=' '(어쨌든 기본 사실을 사용합니다).

이것은정말 짧다 awk한 레코드 및 필드 구분 기호 집합의 입력 형식을 다른 집합으로 간단히 다시 지정하는 명령입니다. 가장 놀라운 점은 입력 레코드 및 필드 구분 기호( RSFS)를 새로운 출력 구분 기호( ORSOFS)로 변경하는 방법입니다.

입력 문서,

"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah
"rew"..?/.."1324.75 United
States"??..."END"

"END"\n레코드 구분 기호로 사용되며 \n(개행)은 필드 구분 기호로 사용됩니다.

필드 구분 기호를 (공백)으로 변경하면 문제가 해결됩니다.

실제로암호이전 필드 구분 기호( ) 대신 새 필드 구분 기호( )가 사용 awk되도록 레코드 형식을 다시 지정 하세요 .OFSFS

결과는 다음과 같습니다

"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah "rew"..?/.."1324.75 United States"??..."END"

기술적으로 다중 문자 값으로 RS호출명시되지 않은행동의 기초awk유틸리티에 대한 POSIX 사양. 대부분의 (모두?) 현재 awk구현에서는 다중 문자 값을 RS정규식으로 처리합니다.

답변2

줄이 sed로 끝나지 않으면 "END"다음과 같이 다음 줄에 연결할 수 있습니다.

sed -e :a -e '/"END"$/!N; s/\n//; ta' file

전임자. 다음 file과 같이 주어진다

"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah
"rew"..?/.."1324.75 United
States"??..."END"

그 다음에

$ sed -e :a -e '/"END"$/!N; s/\n//; ta' file
"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah"rew"..?/.."1324.75 UnitedStates"??..."END"

(원하는 출력과 일치) 이는아니요연결할 때 개행 문자를 대체할 공백을 추가하세요. 공백이 필요하다면 다음 s/\n//으로 변경하세요.s/\n/ /

관련 정보