내 파일은 다음과 같습니다
"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
한 레코드 및 필드 구분 기호 집합의 입력 형식을 다른 집합으로 간단히 다시 지정하는 명령입니다. 가장 놀라운 점은 입력 레코드 및 필드 구분 기호( RS
및 FS
)를 새로운 출력 구분 기호( ORS
및 OFS
)로 변경하는 방법입니다.
입력 문서,
"abc"..,,xyz 123 "New york".."END"
"mnh".....blahblah
"rew"..?/.."1324.75 United
States"??..."END"
"END"\n
레코드 구분 기호로 사용되며 \n
(개행)은 필드 구분 기호로 사용됩니다.
필드 구분 기호를 (공백)으로 변경하면 문제가 해결됩니다.
실제로암호이전 필드 구분 기호( ) 대신 새 필드 구분 기호( )가 사용 awk
되도록 레코드 형식을 다시 지정 하세요 .OFS
FS
결과는 다음과 같습니다
"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/ /