[linux] Mac 및 Linux의 텍스트 파일에서 재귀 검색 및 바꾸기

리눅스 쉘에서 다음 명령은 재귀 적으로 ‘this’의 모든 인스턴스를 ‘that’으로 검색하고 바꿉니다 (내 앞에 Linux 쉘이 없지만 그렇게해야합니다).

find . -name "*.txt" -print | xargs sed -i 's/this/that/g'

OSX에서 비슷한 명령은 어떻게 생깁니 까?



답변

OS X은 BSD와 GNU 도구를 혼합하여 사용하므로 항상 문서를 확인하는 것이 가장 좋습니다 ( lessOS X 맨 페이지를 준수하지 않은 문서도 있음).

https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html

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