여러 줄 의 내용 을 sed 로 대체 합 니 다.

sed 는 * nix 에서 편리 한 줄 편집 도구 로 파일 의 내용 을 교체 하 는 데 자주 사 용 됩 니 다. sed 는 보통 한 줄 을 처리 하지만 내부 구축 기능 을 통 해 크로스 줄 교 체 를 실현 할 수 있 습 니 다 (즉, 교체 할 내용 이 여러 줄 의 내용 이 있 습 니 다).
해결 방법 은 주로 인터넷 에서 검색 한 글 에서 나 왔 지만 글 속 의 협객 은 특별히 명확 하 게 설명 하지 못 했다. 나 는 다른 두 가지 더 어 려 운 예 (하나, 둘) 를 대조 하여 man 과 결합 하여 이해 한 후에 여기에 기록 했다.
우리 의 목표 파일 test 내용 이 이 렇 습 니 다.
file content
  aabbcc<<>>
  ddeeff

지금 은 [[[...]] 이 단락 을 'COMMENT' 로 바 꿔 야 합 니 다. (설명 할 필요 가 있 기 때문에 정규 와 헷 갈 리 기 쉬 운 문자, 예 를 들 어//* {} [] 등 으로 예 를 들 지 않 습 니 다.) 그러면 sed 문법 은 다음 과 같 아야 합 니 다.
:begin
/<<,/>>>/ {
    />>>/! {
        $! {
            N;
             b begin
        }
    }
    s/<<<.>>>/COMMENT/;
}

상기 문 구 는 test. sed 에 저장 되 어 있 습 니 다. 그러면 실행 방식 과 결 과 는 다음 과 같 습 니 다.
$ sed -f test.sed test
        file content
          aabbccCOMMENT
          ddeeff

정규 를 명령 에 직접 써 도 됩 니 다. ";"로 명령 을 구분 하면 됩 니 다.
$ sed -e ":begin; /<<,/>>>/ { />>>/! { $! { N; b begin }; }; s/<<<.>>>/COMMENT/; };" test
        file content
          aabbccCOMMENT
          ddeeff

오른쪽 괄호 뒤에 도 점 수 를 붙 여야 합 니 다.
어때요?알 아 봤 어?제 가 자세히 설명 하 겠 습 니 다. 여러 줄 명령 의 test. sed 파일 의 내용 을 보 겠 습 니 다.
우선 괄호 {} 는 명령 블록 의 시작 을 나타 내 고 c 와 같은 문법 은 그 다음 에 다시 말 하지 않 습 니 다. -i 이것 은 레이 블 입 니 다. man 에 서 는 label 이 라 고 합 니 다. 즉, 점프 표 시 는 b 와 t 명령 에 사용 되 고 이 예 에서 b 명령 을 사 용 했 습 니 다. :begin 주소 범위 (Addresses) 입 니 다. 뒤쪽 {} 의 명령 은 주소 범위 간 의 내용 만 사용 합 니 다.그 중에서 쉼표 앞부분 은 시작 주소 이 고 쉼표 뒤쪽 은 끝 주소 이 며 모두 정규 표현 식 입 니 다.sed 는 '흐름' 식 '줄' 처리 이기 때문에 끝 주 소 는 생략 할 수 있 습 니 다. 즉, 주소 의 끝 범위 가 존재 하지 않 으 면 파일 이 끝 날 때 까지 처리 합 니 다.이 예 에서 이 주소 범 위 를 사용 하 는 것 은 주로 처 리 된 데 이 터 를 축소 하 는 것 입 니 다. 왜냐하면 뒤에 N 명령 으로 한 줄 에 대한 처 리 를 여러 줄 로 확장 하지만 파일 시작 에서 N 으로 확장 하면 <
$ sed -e ":begin; { />>>/! { $! { N; b begin }; }; s/<<<.>>>/COMMENT/; };" test
or
$ sed -e "{:begin;  />>>/! { $! { N; b begin }; }; s/<<<.>>>/COMMENT/; };" test
/<<,/>>>/, />>>/! 내용 의 끝 표 시 를 바 꾸 려 고 하 는데 >>> 를 달 면 한 줄 이 처 리 된 후에 끝 표 시 를 발견 하지 못 하면. !, $! 정규 에서 문자열 의 끝 을 표시 합 니 다. sed 에서 파일 의 마지막 줄 을 대표 합 니 다. 이 문장 과 이전 문장 을 결합 하면 이 줄 에서 끝 표 시 를 발견 하지 못 하고 현재 스 캔 한 줄 은 파일 의 마지막 줄 이 아 닙 니 다. $ 다음 줄 의 내용 을 버퍼 (pattern) 에 추가 한 후, 우리 의 예 에서 처리 N; 와 함께 버퍼 에 넣 으 면 '병합' 이 한 줄 이 되 는 것 과 같 습 니 다 (sed 의 버퍼 에 기본적으로 한 줄 만 포 함 됩 니 다). aabbcc<< , , comment part 2>>> 종료 표시 b begin 를 찾 지 못 했 습 니 다. (위 에서 말 한 버퍼 가 처리 되 지 않 았 음 을 주의 하 십시오) 그래서 여기 서 레이 블 begin 으로 뛰 어 들 어 명령 을 다시 시작 합 니 다.시작 과 끝 표시 사이 에 여러 줄 의 간격 이 있 으 면 여러 번 점프 가 발생 한다. <<< 드디어 s/<<<.>>>/COMMENT/; 더 이상 일치 하지 않 습 니 다. 즉, 우 리 는 끝 표 시 를 찾 았 습 니 다. 그러면 s 명령 으로 교체 합 니 다.시작 과 끝 이 한 줄 에 표시 되면 위의 복잡 한 처 리 를 넘 어 바로 여기까지 실 행 됩 니 다.
sed 의 다른 용 도 는 html 또는 xml 에서 tag 대응 관계 에 따라 지정 한 tag 내용 을 선별 하여 출력 하고 정규 p 명령 을 사 용 했 습 니 다. 기본적으로 '여러 줄 의 내용 을 처리 할 수 없습니다' 와 '탐욕 성' 문제 가 없 는 것 같 습 니 다. 사용 하기 좋 고 강력 합 니 다.
    $ sed -n -e '//p' -e '/<text>/p' from.xml
</text>

주의//같은 줄 에 있 지 않 을 때 만 사용 할 수 있 습 니 다. 그렇지 않 으 면 다음 인 스 턴 스 가 나타 나 는 위치 와 일치 하여 끝 경계 로 합 니 다.
옮 겨 싣다http://www.fwolf.com/blog/post/346)

좋은 웹페이지 즐겨찾기