[linux] Mac (BSD) 및 Linux 모두에서 작동하는 sed 위치 내 플래그

sedLinux와 Mac 모두에서 작동하는 백업없이 Todo in-place 편집을 호출 합니까? sedOS X와 ​​함께 제공 되는 BSD 는 필요할 것 같지만 sed -i '' …, GNU sedLinux 배포판은 일반적으로 따옴표를 백업 확장자 대신 빈 입력 파일 이름으로 해석하여 대신 필요로 sed -i …합니다.

두 가지 특징 모두에서 작동하는 명령 줄 구문이 있습니까? 두 시스템에서 동일한 스크립트를 사용할 수 있습니까?



답변

실제로 sed -i‘쉬운’방법을 사용하려면 다음 DOES가 GNU와 BSD / Mac 모두에서 작동합니다 sed.

sed -i.bak 's/foo/bar/' filename

공간 부족과 점에 유의하십시오.

증명:

# GNU sed
% sed --version | head -1
GNU sed version 4.2.1
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file  file.bak
% cat ./file
bar

# BSD sed
% sed --version 2>&1 | head -1
sed: illegal option -- -
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file  file.bak
% cat ./file
bar

분명히 .bak파일을 삭제할 수 있습니다.


답변

이것은 GNU sed에서는 작동하지만 OS X에서는 작동하지 않습니다.

sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file

이것은 OS X에서는 작동하지만 GNU sed에서는 작동하지 않습니다.

sed -i '' -e 's/foo/bar/' target.file

OS X에서는

  • sed -i -e백업 파일의 확장자가로 설정되어 있기 때문에 사용할 수 없습니다-e
  • sed -i'' -e같은 이유로 사용할 수 없습니다 – -i와 사이에 공백이 필요합니다 ''.

답변

OSX에서는 대부분의 스크립트가 GNU sed 버전 용으로 작성 되었기 때문에 스크립트의 문제를 피하기 위해 항상 Homebrew를 통해 GNU sed 버전을 설치합니다.

brew install gnu-sed --with-default-names

그러면 BSD sed가 GNU sed로 대체됩니다.

또는 기본 이름없이 설치할 수 있지만 다음을 수행하십시오.

  • PATH설치 후 지시에 따라 변경gnu-sed
  • 시스템에서 gsed또는 sed시스템에 따라 스크립트를 체크인하십시오

답변

Noufal Ibrahim이 묻는 것처럼 Perl을 사용할 수없는 이유는 무엇입니까? 모든 Mac에는 Perl이 있으며 기본 시스템에 일부 Perl 버전을 포함하지 않는 Linux 또는 BSD 배포판은 거의 없습니다. 실제로 Perl이 없을 수있는 유일한 환경 중 하나는 BusyBox입니다 ( -i백업 확장명을 지정할 수 없다는 점을 제외하고 GNU / Linux 용으로 작동 ).

ismail이 권장하는 대로

펄은 어디에서나 사용할 수 있기 때문에 perl -pi -e s,foo,bar,g target.file

이것은 sed -iGNU / Linux와 BSD / Mac 의 기본적인 비 호환성을 처리하기 위해 스크립트, 별명 또는 기타 해결 방법보다 거의 모든 경우에 더 나은 솔루션 인 것 같습니다 .


답변

작동시킬 방법이 없습니다.

한 가지 방법은 다음과 같은 임시 파일을 사용하는 것입니다.

TMP_FILE=`mktemp /tmp/config.XXXXXXXXXX`
sed -e "s/abc/def/" some/file > $TMP_FILE
mv $TMP_FILE some/file

이것은 둘 다에서 작동합니다


답변

답 : 아니요.

원래 승인 된 답변은 실제로 요청에 따라 수행되지 않습니다 (의견에 명시된 바와 같이). (a file-e가 내 디렉토리에 “무작위로”나타나는 이유를 찾을 때이 답변을 찾았습니다 .

sed -iMacOS와 Linuces에서 일관되게 작업 할 수있는 방법은 없습니다 .

가치있는 것에 대한 나의 추천 sed은 (복잡한 실패 모드를 가진) 제자리로 업데이트 하는 것이 아니라 새 파일을 생성하고 나중에 이름을 바꾸는 것입니다. 즉, 피하십시오 -i.


답변

-i옵션은 POSIX Sed의 일부가 아닙니다 . 보다 편리한 방법은 Ex 모드에서 Vim을 사용하는 것입니다.

ex -sc '%s/alfa/bravo/|x' file
  1. % 모든 줄을 선택하십시오

  2. s 바꾸다

  3. x 저장하고 닫습니다