[bash] awk 또는 sed로 문자열을 재귀 적으로 찾거나 바꾸는 방법은 무엇입니까?

발생하는 모든 항목을 찾아서 바꾸려면 어떻게합니까?

subdomainA.example.com

subdomainB.example.com

/home/www/디렉토리 트리 아래의 모든 텍스트 파일에서 재귀 적으로?



답변

find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'

-print0find줄 바꿈이 아닌 널 문자로 구분 된 각 결과를 인쇄하도록 지시 합니다. 디렉토리에 이름에 줄 바꿈이있는 파일이있는 경우에도 xargs올바른 파일 이름으로 작업 할 수 있습니다 .

\( -type d -name .git -prune \)는이라는 모든 디렉토리를 완전히 건너 뛰는 표현식입니다 .git. SVN을 사용하거나 보존하려는 다른 폴더가 있으면 쉽게 확장 할 수 있습니다. 더 많은 이름과 일치하면됩니다. -not -path .git디렉토리의 모든 파일을 검사하는 대신 파일을 완전히 건너 뛰기 때문에 대략적으로 이지만 더 효율적입니다. -o그 후에 때문에 방법의 필요 -prune실제로 작동합니다.

자세한 내용은를 참조하십시오 man find.


답변

참고 : git repo를 포함하는 폴더에서이 명령을 실행하지 마십시오. .git를 변경하면 git 색인이 손상 될 수 있습니다.

find /home/www/ -type f -exec \
    sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +

여기의 다른 답변과 비교할 때, 이것은 대부분의 것보다 간단하고 펄 대신 sed를 사용합니다. 이는 원래 질문에서 요구 한 것입니다.


답변

나를위한 가장 간단한 방법은

grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'


답변

모든 트릭은 거의 동일하지만 나는 이것을 좋아합니다.

find <mydir> -type f -exec sed -i 's/<string1>/<string2>/g' {} +
  • find <mydir>: 디렉토리에서 찾아보십시오.

  • -type f:

    파일 형식 : 일반 파일

  • -exec command {} +:

    이 -exec 조치 변형은 선택된 파일에서 지정된 명령을 실행하지만 명령 행은 선택한 각 파일 이름을 끝에 추가하여 빌드됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령 행은 xargs가 명령 행을 빌드하는 것과 거의 같은 방식으로 빌드됩니다. `{} ‘인스턴스는 하나만 허용됩니다. 명령은 시작 디렉토리에서 실행됩니다.


답변

cd /home/www && find . -type f -print0 |
  xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'


답변

나에게 가장 기억하기 쉬운 해결책은 https : //.com/a/2113224/565525입니다.

sed -i '' -e 's/subdomainA/subdomainB/g' $(find /home/www/ -type f)

참고 : -i ''OSX 문제 해결sed: 1: "...": invalid command code .

참고 : 처리 할 파일이 너무 많으면 얻을 수 Argument list too long있습니다. 해결 방법 – 위에서 설명한 사용 find -exec또는 xargs솔루션.


답변

실버 검색기를 사용하는 사람 ( ag)

ag SearchString -l0 | xargs -0 sed -i 's/SearchString/Replacement/g'

ag는 기본적으로 git / hg / svn 파일 / 폴더를 무시하므로 저장소 내에서 실행하는 것이 안전합니다.