여러 줄 의 내용 을 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)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
awk 상용 명령awk 는 모든 입력 줄 을 하나의 기록 으로 인식 하고 그 줄 의 모든 단어 도 메 인 을 하나의 필드 로 인식 합 니 다. ARGC 명령 줄 에 awk 스 크 립 트 가 들 어 오 는 매개...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.