답변:
OS X은 BSD와 GNU 도구를 혼합하여 사용하므로 항상 문서를 확인하는 것이 가장 좋습니다 ( less
OS X 맨 페이지를 준수하지 않은 문서도 있음).
sed는 -i
백업의 확장명으로 after 인수를 사용합니다. -i ''
백업하지 않으 려면 빈 문자열 ( )을 제공하십시오 .
다음을 수행해야합니다.
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
는 -type f
단지 좋습니다; sed는 디렉토리를 주면 불평합니다.
-exec
보다 바람직하다 xargs
; 귀찮게 할 필요가 없습니다 -print0
. {} +
마지막 수단에서 find
대신, 호출 명령의 한 인스턴스에 인수로 모든 결과를 추가합니다 각각의 결과를 도출하기 위하여 해당 정보를 재 실행. (OS에서 허용하는 최대 수의 명령 줄 인수가 위반되는 경우 find
는 예외입니다.이 경우 둘 이상의 인스턴스가 실행됩니다.)
%
문자를 사용할 수 있습니다 sed "s%localhost/site%blah/blah%"
. 또 다른 대안은 구분 기호를 백 슬래시 이스케이프 처리하는 것 sed "s/localhost\/site/blah\/blah/"
입니다.
illegal byte sequence
오류가 있습니까? 그렇다면 시도하십시오 : LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
, 그것은 나를 위해 일했습니다.
/g
같은 여러 ocurrencies 위해LC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
맥의 경우 더 비슷한 접근 방식은 다음과 같습니다.
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
대안 솔루션으로 Mac OSX 10.7.5에서이 솔루션을 사용하고 있습니다.
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
크레딧 : Todd Cesere의 답변
위의 어느 것도 OSX에서 작동하지 않습니다.
다음을 수행하십시오.
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
Linux 및 Mac OS X 모두에서 작동하는 버전 ( -e
스위치를 에 추가하여 sed
) :
export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'
export LC_CTYPE=C && export LANG=C
이 명령을 입력 할 때마다 항상 명령을 내리거나 깃발을 잊어 버리는 것 같습니다. TaylanUB의 답변을 기반으로 현재 디렉토리에서 전역 찾기를 수행하는 github에서 Gist를 만들었습니다. 이것은 Mac OSX 전용입니다.
https://gist.github.com/nateflink/9056302
이제 터미널을 열어서 복사하기 때문에 좋습니다.
컬 -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
이상한 바이트 시퀀스 오류가 발생할 수 있으므로 전체 코드는 다음과 같습니다.
#!/bin/bash
#By Nate Flink
#Invoke on the terminal like this
#curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: ./$0 [find string] [replace string]"
exit 1
fi
FIND=$1
REPLACE=$2
#needed for byte sequence error in ascii to utf conversion on OSX
export LC_CTYPE=C;
export LANG=C;
#sed -i "" is needed by the osx version of sed (instead of sed -i)
find . -type f -exec sed -i "" "s|${FIND}|${REPLACE}|g" {} +
exit 0
나는이 형식을 사용했지만 ... 매우 이상하게 발견 된 모든 인스턴스를 실제로 변경하려면 3 번 이상 실행해야한다는 것을 알았습니다. 한 번 실행하면 각 파일의 일부가 변경되지만 전부는 아닙니다. 정확히 같은 문자열을 2-4 번 실행하면 모든 인스턴스를 잡을 수 있습니다.
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
g
마지막에 sed 정규 표현식이 a / b를 필요로하기 때문에이 명령을 여러 번 b / c로 실행해야했습니다 . 그렇지 않으면 thistext
행 의 첫 번째 항목 만 바꿉니다 . 따라서 정규 표현식은s/thistext/newtext/g
https://bitbucket.org/masonicboom/serp 는 OSX에서 테스트 된 go 유틸리티 (예 : 크로스 플랫폼)로, 주어진 디렉토리 내의 파일에서 텍스트를 재귀 적으로 검색 및 교체하고 각 교체를 확인합니다. 새로운 기능이므로 버그가있을 수 있습니다.
사용법은 다음과 같습니다.
$ ls test
a d d2 z
$ cat test/z
hi
$ ./serp --root test --search hi --replace bye --pattern "*"
test/z: replace hi with bye? (y/[n]) y
$ cat test/z
bye
OSX의 명령은 예쁜 UI에서 Unix와 정확히 동일해야합니다.
-print0
받는 추가 find
플래그와 -0
받는 xargs
플래그.
-exec sed -i s/this/that/g {} \+
대신 -print
xargs를 사용할 수 있습니다
xargs
공백으로 구분 된 "./jacobus"를 파일로 전달한 sed
다음 "R.txt"와 함께 사용할 수 있습니다. 둘 다 존재하지 않습니다.
apple.stackexchange.com
리눅스 나 모든 개발자들에게는 일반적인 것이 아니기 때문에 아마 옮겨야 할 것입니다 .