^pattern2와 해당 "; 사이의 줄을 병합하고 싶습니다.
이것을 변경하십시오:
pattern2
"xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2
"xxxx xxxxxxx xxxxxxxxx xxxxxxxxx
yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2
"xxx xxxxxx xxxxxxxx";
도착하다
pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";
이전에 이 sed 명령을 사용한 적이 있습니다.
sed -i -e '/^pattern2/!b' -e :a -e 'N;/\;/!ba' -e 's/\n/ /g' input_file
하지만 이 경우에는 다음과 같은 출력이 제공됩니다.
pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx"; pattern2
"xxxx xxxxxxx xxxxxxxxx xxxxxxxxx
yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";
감사해요
답변1
어때요?
$ sed '/^pattern2/{
:1
/;$/b
N
s/\n/ /
t1
}' file
pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";
한 줄로
sed '/^pattern2/{:1;/;$/b;N;s/\n/ /;t1;}' file
답변2
GNU sed
확장된 정규식 패턴( -E
) 으로 이동을 사용하세요 .
sed -E '
/^pattern2(.*[^;])?$/{
N;H;z;x;D
}
y/\n/ /
' file
답변3
sed '/^pattern2/{/;$/b; :a N;//!ba;y/\n/ /}' test
pattern2
로 시작 하지만 끝나지 않는 줄의 경우 ;
, 로 끝나는 줄이 나타날 때까지 버퍼에 새 줄을 넣는 루프를 시작합니다 ;
. 이 조건이 충족되면 모든 새 줄을 공백으로 바꿉니다. 그런 다음 기본 작업인 인쇄를 수행합니다.
당신이 확신한다면아니요 ;
큰따옴표(위치 x
) 안에 삽입하면 단락할 수 있습니다 sed
.
sed '/^pattern2[^;]*$/{:a N;/;$/!ba;y/\n/ /}' test
답변4
GNU awk를 사용한 다중 문자 RS 및 속기 \s
:
$ awk 'BEGIN{RS=ORS="\";\n"; FS="\\s*\n\\s*"} /^pattern2/{$1=$1} 1' file
pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";
위의 내용은 질문의 예상 출력을 생성하지만 현재 sed 답변은 그렇지 않습니다. 세 번째 출력 라인은 pattern2<blank><blank>"xxxx
대신 sed 로 시작 되기 때문입니다 pattern2<blank>"xxxx
. ;
다음 입력과 같이 인용된 문자열의 줄 끝에 sed의 답변이 포함되어 있어도 작동합니다( ;
다섯 번째 줄 끝 부분에 인용된 문자열 참고).
$ cat file
pattern2
"xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2
"xxxx xxxxxxx xxxxxxxxx xxxxxxxxx;
yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2
"xxx xxxxxx xxxxxxxx";
$ awk 'BEGIN{RS=ORS="\";\n"; FS="\\s*\n\\s*"} /^pattern2/{$1=$1} 1' file
pattern2 "xxx xxxxxx xxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx";
pattern2 "xxxx xxxxxxx xxxxxxxxx xxxxxxxxx; yyyy yyyyyy yy yyyyyyyyyy yyyyyyy";
pattern3
"xxx xxxxxx xxxxxxxx
xxx xxxxxx xxxxxxxx";
pattern2 "xxx xxxxxx xxxxxxxx";