리눅스 쉘에서 다음 명령은 재귀 적으로 ‘this’의 모든 인스턴스를 ‘that’으로 검색하고 바꿉니다 (내 앞에 Linux 쉘이 없지만 그렇게해야합니다).
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
OSX에서 비슷한 명령은 어떻게 생깁니 까?
답변
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
는 예외입니다.이 경우 둘 이상의 인스턴스가 실행됩니다.)
답변
맥의 경우 더 비슷한 접근 방식은 다음과 같습니다.
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
답변
대안 솔루션으로 Mac OSX 10.7.5에서이 솔루션을 사용하고 있습니다.
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
크레딧 : Todd Cesere의 답변
답변
Mac OSX 10.11.5에서는 다음과 같이 작동합니다.
grep -rli 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
답변
위의 어느 것도 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'
답변
이 명령을 입력 할 때마다 항상 명령을 내리거나 깃발을 잊어 버리는 것 같습니다. 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