이 작업을 수행하는보다 효율적인 방법은 주소를 사용하는 것입니다. 당신은 이것을 할 수 있습니다 :
printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'
이러한 방식으로 줄에 문자열 cat 이없고 문자열 dog 문자열 sed
b
이 스크립트에서 빠져 나오지 않으면 현재 줄을 자동 인쇄하고 다음 줄을 당겨 다음 사이클을 시작합니다. 따라서 다음 명령을 수행하지 않습니다.이 예 c
에서는 Bear 를 읽기 위해 전체 행을 걸지만 아무 것도 할 수 있습니다.
!b
해당 sed
명령 에서 다음에 나오는 명령문 은 문자열을 포함하는 행 에서만 일치 dog
하거나 cat
-일치하지 않는 행을 일치시킬 위험없이 추가 테스트를 수행 할 수 있습니다. 이제 규칙을 적용 할 수 있습니다. 한 쪽 또는 다른쪽에 만.
그러나 다음입니다. 위 명령의 출력 결과는 다음과 같습니다.
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
역 참조로 룩업 테이블을 이식 가능하게 구현할 수도 있습니다.
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'
이 간단한 예제에서는 설정 작업이 훨씬 많지만 sed
장기적으로 훨씬 더 유연한 스크립트를 만들 수 있습니다 .
첫 번째 줄에서 x
홀드 스페이스와 패턴 스페이스를 변경 한 다음 문자열 <space>
고양이 <space>
도그<space>
를 홀드 스페이스에 삽입 한 다음 x
다시 변경합니다.
그때부터 모든 다음 줄 G
에서 패턴 공간에 추가 된 공간을 유지하고 마지막에 방금 추가 한 줄 바꿈까지 줄의 시작 부분에서 모든 문자가 그 뒤에 공백으로 둘러싸인 문자열과 일치하는지 확인하십시오. 그렇다면 나는 전체 로트를 Bear로 교체하고 P
패턴 공간에서 처음 나타나는 개행 d
까지만 찢어 버리고 해를 끼치 지 않으면 해를 끼치 지 않습니다 .
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
그리고 내가 유연하다고 말할 때, 나는 그것을 의미합니다. 여기가 대체 고양이 와 BrownBear 와 개 에 BlackBear :
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ 1cat Brown 2dog Black /;x
};G;s/^\(.*\)\n.* [0-9]\1 \([^ ]*\) .*/\2Bear/;P;d'
###OUTPUT###
BrownBear
BlackBear
pear
banana
BrownBear
BlackBear
물론 룩업 테이블의 내용을 크게 확장 할 수 있습니다 . 90 년대에 Greg Ubben의 유즈넷 이메일에서 주제에 대한 아이디어를 얻었 습니다 sed s///
.
-r
에-E
대한 동의어로 옵션을 지원합니다 . OpenBSD와 OS Xsed -E
은 이스케이프 된 파이프를 대체 연산자가 아닌 리터럴 파이프로 해석합니다. 여기에 작동 링크의 는 NetBSD 매뉴얼 페이지는 그리고 여기에 하나 열살없는 오픈 BSD합니다.