2014-09-30 3 views
3

다음은 Mac OS에서 sed 명령을 사용하는 텍스트입니다.sed 사용 : 예상 컨텍스트 주소

$ cat pets.txt 
This is my cat 
    my cat's name is betty 
This is your dog 
    your dog's name is frank 
This is your fish 
    your fish's name is george 
This is my goat 
    my goat's name is adam 

나는 실행하면

$ sed '/dog/,+3s/^/# /g' pets.txt 

그것은 보여 (BSD가 나오지도) 오류 : 그것이 뭐가 잘못

sed: 1: "/dog/,+3s/^/# /g": expected context address 

? gsed(GNU sed)을 사용하면 잘 작동합니다.

답변

7

은 '당신 때문에에게 나오지 GNU 프로젝트에 sed에 추가 된 기능을 이용합니다. 이전에는 프로그램에 없었지만 (여전히 GNU 버전이 아님)

당신은 이런 식으로 나오지도 않은 GNU에서 동일한 결과를 얻을 수 있습니다 : 우리는 "개"를 참조하면된다

sed -E '/dog/{N;N;N;s/(^|\n)/&# /g;}' pets.txt 

역시 다음 세 줄을 끌어. 그런 다음 줄 시작 부분 (^)과 모든 줄 바꿈 (\n) 뒤에 # + 공백을 둡니다. 단일 정규식에서 검색 및 바꾸기를 수행하려면 -E의 확장 정규 표현식을 사용해야합니다. 당신은 GNU를 설치하지 않고 주식 Mac에서이 작업을 수행하는 또 다른 방법을 찾고 있다면

sed '/dog/{N;N;N;s/^/# /;s/\n/&# /g;}' pets.txt 

: 그게 없으면, 우리는 두 s 명령의 줄 바꿈에 대한 줄의 시작에 대한 하나 하나 그것을 할 수 로 coreutils, 당신은 예를 들어, AWK를 들어, 다른 유틸리티에 도달 할 수 있습니다 :

awk '/dog/ {l=3}; (l-- > 0) {$0="# "$0} 1' pets.txt 

또는 펄합니다 (AWK 버전과 같은 생각, 단지 다른 구문) :

perl -pe '$l=3 if /dog/; s/^/#/if $l-- > 0;' pets.txt 
+0

나는 정기적으로 확장하여 선호를 특급 나는 펄 정규 표현식을 항상 사용하기 때문에. 완벽한 설명에 감사드립니다. – lutaoact

4

Mac OS X은 GNU sed이 아닌 BSD sed을 사용합니다.

Mac OS X sed과 함께 GNU sed 확장자를 사용하면 결과가 달라 지거나 오류가 발생합니다.

일반적으로 sed은 숫자 오프셋, 앞뒤 값을 지원하지 않습니다. 당신은 맥 OS X의에서 작동하도록 스크립트를 수정해야합니다

이 주어진 데이터 작업,하지만 fish의 사용이 용의자 : 그것은 GNU와 함께 작동

sed '/dog/,/your fish/s/^/# /g' pets.txt