Sed는 서로 다른 두 모드 사이의 구분선을 병합합니다.

Sed는 서로 다른 두 모드 사이의 구분선을 병합합니다.

^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";

관련 정보