[linux] -i 옵션이있는 sed 명령은 Mac에서 실패하지만 Linux에서는 작동합니다.

sedLinux에서 텍스트를 검색 / 바꾸기 위해 다음 명령을 성공적으로 사용했습니다 .

sed -i 's/old_link/new_link/g' *

그러나 Mac OS X에서 시도하면 다음과 같은 결과가 나타납니다.

“명령 c는 \ 다음에 텍스트가 필요합니다”

내 Mac이 정상적인 BASH 셸을 실행한다고 생각했습니다. 뭐야?

편집하다:

@High Performance에 따르면, 이것은 Mac sed의 BSD 풍미가 다르기 때문에 BSD 에서이 명령을 어떻게 복제 sed합니까?

편집하다:

이것을 일으키는 실제 예는 다음과 같습니다.

sed -i 's/hello/gbye/g' *



답변

-i옵션 을 사용하는 경우 백업 확장명을 제공해야합니다.

당신이 가지고 있다면:

File1.txt
File2.cfg

명령 ( -i및 새로운 버전의 Mac 및 GNU에서 작동 ''하도록 -e하기 위해 및 사이에 공간이 부족함 ) :

sed -i'.original' -e 's/old_link/new_link/g' *

다음과 같은 2 개의 백업 파일을 작성하십시오.

File1.txt.original
File2.cfg.original

모든 경우에 작동하는 sed 명령을 혼합하여 찾을 수 없기 때문에 백업 파일 작성을 피하는 휴대용 방법은 없습니다.

  • sed -i -e ...-e백업 을 생성 할 때 OS X에서 작동하지 않습니다
  • sed -i'' -e ... -OS X 10.6에서는 작동하지 않지만 10.9+에서는 작동합니다.
  • sed -i '' -e ... -GNU에서 작동하지 않습니다

참고 모든 플랫폼에서 작동하는 sed 명령이없는 경우 다른 명령을 사용하여 동일한 결과를 얻을 수 있습니다.

예 : perl -i -pe's/old_link/new_link/g' *


답변

-i를 사용할 때 OS X에 백업 파일의 확장자가 필요하다고 생각합니다 . 시험:

sed -i .bak 's/hello/gbye/g' *

GNU를 사용 sed하는 확장은 선택 사항 입니다.


답변

이것은 sed의 GNU 및 BSD 버전 모두에서 작동합니다.

sed -i'' -e 's/old_link/new_link/g' *

또는 백업 :

sed -i'.bak' -e 's/old_link/new_link/g' *

-i옵션 뒤에 공백이 없습니다 . (GNU sed에 필요)


답변

Mac에서 동일한 문제가 있었고 다음과 같이 해결했습니다 brew.

brew install gnu-sed

로 사용

gsed SED_COMMAND

sed별명으로 설정할 수도 있습니다 gsed(원하는 경우).

alias sed=gsed


답변

또는 Mac에 gsed라고하는 sed의 GNU 버전을 설치하고 표준 Linux 구문을 사용하여 사용할 수 있습니다.

이를 위해 gsed포트를 사용하여 설치하십시오 (없는 경우 http://www.macports.org/ 에서 구 하십시오 ) sudo port install gsed. 그런 다음 실행할 수 있습니다sed -i 's/old_link/new_link/g' *


답변

Mac은 실제로 BASH 셸을 실행하지만 이는 처리중인 sed의 구현에 대한 질문입니다. Mac에서 sed는 BSD에서 제공되며 일반적인 Linux 상자에서 찾을 수있는 sed와 미묘하게 다릅니다. 나는 당신을 제안합니다 man sed.


답변

Sinetris의 대답은 옳지 만 find명령 과 함께 사용 하여 변경하려는 파일을 더 구체적으로 지정합니다. 일반적으로 이것은 작동해야합니다 (osx에서 테스트 됨 /bin/bash).

find . -name "*.smth" -exec sed -i '' 's/text1/text2/g' {} \;

복잡한 프로젝트에서 사용 sed하지 않고 일반적으로 사용하는 경우 find효율성이 떨어집니다.