2014-01-20 2 views
15

내 프로젝트에서 바이슨 파서를 사용하고 있습니다. 나는 다음과 같은 명령을 실행하면 :sed : -i는 Mac OS X에서 stdin과 함께 사용할 수 없습니다

sed -i y.tab.c -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/" 

을 나는 나오지이 오류 를 얻을 : -i는 표준 입력

명령은 리눅스 시스템에서 잘 작동과 함께 사용할 수 없습니다. Mac OS X 10.9를 사용하고 있습니다. Mac OS X에서만 오류가 발생합니다. 왜 그런지 모르겠습니다. 누구든지 도와 줄 수 있습니까?

감사합니다.

+0

"-e"플래그를 제거하고 "y.tab.c"를 줄 끝에 넣으십시오. 이렇게 :'sed -i "s /.../"y.tab.c – Trenin

답변

8

입력 매개 변수를 마지막 매개 변수로 사용해야합니다.

sed -i -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/" y.tab.c 
+0

고마워. 그것은 효과가있다! :) – sarghau

18

문제는 맥 OS X이 약간 다르게 -i 옵션을 취급 sed의 BSD 버전을 사용한다는 것입니다. Linux에서 사용되는 GNU 버전은 -i과 함께 옵션 인수를 취합니다. 존재하는 경우 sed은 이름이 입력 파일과 인수로 구성된 백업 파일을 만듭니다. 인수가 없으면 sed은 원본 파일을 저장하지 않고 입력 파일을 간단히 수정합니다.

BSD sed에서는 -i의 인수가 필요합니다. 백업을 피하려면 길이가 0 인 인수를 제공해야합니다. sed -i '' y.tab.c ....

리눅스에서 백업없이 y.tab.c을 단순히 편집하는 명령은 'y.tab.c'를 확장자로 사용하여 백업 파일을 저장하려고 시도합니다. 그러나 이제는 명령 행에 다른 파일이 없으므로 sed은 표준 입력을 현재 위치에서 편집하려고한다고 생각합니다. 허용되지 않는 것이 있습니다.

+0

정보를 제공해 주셔서 감사합니다! – sarghau

+1

'sed -i 'file'은 OSX에서 작동하지만 휴대용이 아닙니다. 적어도 Cygwin과 아마도 Linux에서는 실패합니다. 'sed -i '.bak'file '은 내가 찾을 수있는 가장 이식성있는 구문이지만 그 다음에는'rm file.bak'을해야합니다. –

+0

POSIX 표준이'-i' 옵션을 지정하지 않았으므로 어느 형식도 이식성이 없습니다. 진정한 이식성을 위해서 임시 파일을 직접 처리해야합니다 :'sed '...'file> file.new; mv 파일 file.bak; mv 파일. 새 파일'. – chepner

2

더러운 빠른 및-솔루션 @의 chepner의 설명 오프 돼지 - 후원 :

다음, 그 작업이 brew install gnu-sed 함께 할거야 sed는 버전을 설치 스크립트에서 sed의 용도를 교체 gsed.

은 (브루 사회는 OS X의 발생할 수있는 문제 내장 기능이 예기치 않게 무시하는 상당히 인식이며 대부분의 대체-배포판의 명령에 대해 그렇게하지로 일했다.)이 나오지에서

3

맨 : 지정된 확장자를 가진 백업 저장 현재 위치에서

-i 확장 편집 파일. 길이가 0 인 확장자가 주어지면 백업이 저장되지 않습니다. 현재 위치에서 파일을 편집하고, 당신이 등 디스크 공간이 소모 situ- ations의 손상 또는 부분적인 내용을 위험으로

솔루션가 될 때 는 길이 제로의 확장을 제공하지 않는 것이 좋습니다 다음과 같은 길이가 0 인 확장자를 보내주십시오.

sed -i '' 's/apples/oranges/' file.txt