세 가지 sed
명령 :
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
세 가지 모두 기본 s///
ubstitution 명령을 기반으로합니다 .
s/"[^"]*"\n<[^>]*>/other characters /
또한 sed
에지 라인 의 출력이 서로 다른 경향이 있기 때문에 마지막 라인을 다룰 때주의를 기울입니다 . 이것은 의미가 마지막 $!
이 !
아닌 모든 행과 일치하는 주소 $
입니다.
또한 모두 N
ext 명령을 사용하여 다음 입력 행을 추가하여 \n
ewline 문자 다음의 패턴 공간에 추가합니다 . sed
한동안 지낸 사람이라면 누구나 \n
ewline 특성 에 의존하는 법을 배웠을 것입니다. 왜냐하면 그것을 얻는 유일한 방법은 그것을 명시 적으로 넣는 것뿐이기 때문입니다.
세 가지 모두 조치를 취하기 전에 가능한 한 적은 양의 입력을 읽으려고 시도합니다 sed
. 그렇게하기 전에 전체 입력 파일에서 읽거나 읽을 필요가없는 한 빨리 작동합니다.
비록 그들이 모두했지만 N
, 세 가지 모두 재귀 방법이 다릅니다.
첫 번째 명령
첫 번째 명령은 매우 간단한 N;P;D
루프를 사용합니다. 이 세 명령은 모든 POSIX 호환에 내장되어 있으며 sed
서로 훌륭하게 보완합니다.
이 명령 은 ubstitution 문과 일치 하지 않는 행에 대해서만 반복됩니다 s///
. 때문에 s///
ubstitution가 제거 \n
로 추가 ewline을 N
때 나머지 결코 아무것도가 sed
D
eletes 패턴 공간을.
P
및 / 또는 D
선택적으로 적용하기 위해 테스트를 수행 할 수 있지만 해당 전략에 더 적합한 다른 명령이 있습니다. 대체 규칙의 일부 에만 일치하는 연속 행을 처리하기 위해 재귀가 구현되므로, ubstitution 의 양쪽 끝 과 일치하는 연속적인 행 시퀀스 s///
가 제대로 작동하지 않습니다.
이 입력이 주어지면 :
first "line"
<second>"line"
<second>"line"
<second>line and so on
... 인쇄 ...
first other characters "line"
<second>other characters line and so on
그러나 처리합니다.
first "line"
second "line"
<second>line
... 괜찮아.
두 번째 명령
이 명령은 세 번째와 매우 유사합니다. 둘 다 :b
목장 / t
est 레이블을 사용하고 ( 여기서 Joeseph R.의 답변에 설명되어 있음 ) 특정 조건에서 다시 되풀이 됩니다.
-e :n -e
-이식 가능한 sed
스크립트는 ewline 또는 새로운 인라인 xecution 문 으로 :
레이블 정의를 구분합니다 .
\n
-e
:n
-라는 레이블을 정의합니다 n
. bn
또는 을 사용하여 언제든지 되돌릴 수 있습니다 tn
.
tn
- t
지정된 라벨로 추정 명령이 리턴 (없음이 제공되지 않은 경우 또는, 현재 행주기위한 스크립트를 종료) 이있는 경우 s///
ubstitution 레이블 중 하나가 정의 된 이후 또는가 마지막으로 시작된 이후라는 t
성공적인 ESTS을.
이 명령에서 일치하는 행에 대해 재귀가 발생합니다. 경우 sed
성공적으로 패턴 대신 다른 문자 , sed
받는 돌아 :n
다시 레이블과 시도를. 경우 s///
ubstitution이 수행되지 않습니다 sed
autoprints에게 패턴 공간을 다음 행주기를 시작한다.
이것은 연속 시퀀스를 더 잘 처리하는 경향이 있습니다. 마지막 것이 실패하면 다음과 같이 인쇄됩니다.
first other characters other characters other characters line and so on
세 번째 명령
언급했듯이 여기의 논리는 마지막과 매우 유사하지만 테스트는 더 명확합니다.
/"$/bn
-이건 sed
테스트 야 때문에 b
목장 명령이 주소의 함수이며, sed
의지 만 b
에 목장 다시 :n
후 \n
ewline이 추가 및 패턴 공간이 여전히으로 끝 "
따옴표.
적게 사이에 다있다 N
하고 b
가능한 한 -이 방법으로 sed
매우 빠르게 다음 줄이 규칙과 일치하지 수 있도록 필요한만큼 입력으로 정확하게 수집 할 수 있습니다. s///
여기가 사용하는 것을 ubstitution의 다릅니다 g
은 한 번에 모든 필요한 교체 할 수 있도록하고 - lobal 플래그. 동일한 입력이 주어지면이 명령은 마지막과 동일하게 출력됩니다.
\n
내가 물어 왜 만들 ewline 문이다. 사람들s//\n/
은 GNU로 할 수있는 대로 할 수 있는지 거의 묻지sed
않지만, 다른 대부분sed
은 오른쪽에서 탈출을 거부 할 것입니다. 여전히\n
이스케이프는 POSIX의 왼쪽에서 작동하며 항상 효과가 같지 않으므로 항상 유용 하지는 않지만sed
이식 가능하게 번역 할 수 있습니다 .y/c/\n/
s/c/\n/g