programing

awk 또는 sed를 사용하여 문자열을 재귀적으로 검색/교체하려면 어떻게 해야 합니까?

javamemo 2023. 4. 10. 20:49
반응형

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.

가장 간단한 방법은

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

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

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

여기의 다른 답변과 비교하면, 이것은 대부분의 답변보다 단순하며, 원래 질문에서 요구한 perl 대신 sed를 사용합니다.

모든 속임수는 거의 비슷하지만, 나는 이것을 좋아한다.

find <mydir> -type f -exec sed -i 's/<string1>/<string2>/g' {} +
  • find <mydir> 합니다.: 디렉토리에서 검색합니다.

  • -type f

    파일은 일반 파일 형식입니다.

  • -exec command {} +:

    이 유형의 -exec 액션에서는 선택한 파일에 대해 지정된 명령어가 실행되지만 명령줄은 선택한 각 파일 이름을 끝에 추가하여 구축됩니다. 명령어 호출의 총 수는 일치하는 파일 수보다 훨씬 적습니다.명령줄은 xargs가 명령줄을 작성하는 것과 거의 동일한 방식으로 구축됩니다.명령어 내에는 '{}' 인스턴스가 하나만 허용됩니다.이 명령어는 시작 디렉토리에서 실행됩니다.

저에게 있어서 가장 기억하기 쉬운 솔루션은 https://stackoverflow.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를 참조해 주세요.

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

실버 서커를 사용하는 사용자용(ag)

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

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

이것은 git 저장소와 호환되며 조금 더 간단합니다.

Linux:

git grep -l 'original_text' | xargs sed -i 's/original_text/new_text/g'

Mac:

git grep -l 'original_text' | xargs sed -i '' -e 's/original_text/new_text/g'

(http://blog.jasonmeridth.com/posts/use-git-grep-to-replace-strings-in-files-in-your-git-repository/) 덕분에)

sed를 통해,은 ,, 할, 할, 할을 수 있다.grep다음 중 하나:

grep -rl <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g

<고객명>을man grep도 이렇게 ' 낫다'를 할 수 --exlude-dir="*.git".디렉토리에서를 붙입니다.합니다.flags 디렉토리에서 검색을 생략하고 싶을 경우 플래그를 붙입니다.다른 사람들이 정중하게 지적한 git 인덱스 문제를 회피합니다.

다음과 같은 이유:

grep -rl --exclude-dir="*.git" <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g

디렉토리를 제외할 필요가 있는 경우는, 간단한 방법(--exclude-dir=..folder공백이 있는 파일 이름(양쪽 모두 0Byte를 사용하여 해결)도 사용할 수 있습니다.grep -Z ★★★★★★★★★★★★★★★★★」xargs -0)

grep -rlZ oldtext . --exclude-dir=.folder | xargs -0 sed -i 's/oldtext/newtext/g'

엑스트라로 멋진 오넬라이너 하나.git grep 사용.

git grep -lz 'subdomainA.example.com' | xargs -0 perl -i'' -pE "s/subdomainA.example.com/subdomainB.example.com/g"

가장 간단한 치환 방법(모든 파일, 디렉토리, 재귀적)

find . -type f -not -path '*/\.*' -exec sed -i 's/foo/bar/g' {} +

주의: 일부 숨겨진 파일은 무시해야 할 수 있습니다. .git위의 명령어를 사용할 수 있습니다.

숨김 파일 사용을 포함하려면

find . -type f  -exec sed -i 's/foo/bar/g' {} +

모두 " " " "foo됩니다.bar

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

find /home/www/ -type f/home/www/(으)로 설정합니다.는 발견된 각 다음 합니다."-exec" "실행"

perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +

는 파일에서 실행되는 명령어입니다(한 번에 여러 개).{}파일명으로 대체됩니다.+명령어 마지막에 알립니다.find여러 파일 이름에 대해 하나의 명령어를 작성합니다.

find page: "하는 것과 거의 됩니다.": "xargs" "xargs는 명령줄을 구축하는 것입니다

'스페이스가을 사용하지 할 수 xargs -0 , 「」-print0.

저는 단지 이것이 필요했을 뿐이며, 이용 가능한 예시의 속도에 만족하지 못했습니다.그래서 나는 나만의 것을 생각해냈다.

cd /var/www && ack-grep -l --print0 subdomainA.example.com | xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'

Ack-grep은 관련 파일을 찾는 데 매우 효율적입니다.이 명령어는 약 145,000개의 파일을 쉽게 대체한 반면, 다른 명령어는 너무 오래 걸려서 완료될 때까지 기다릴 수 없었습니다.

또는 초고속 GNU 병렬을 사용합니다.

grep -rl oldtext . | parallel sed -i 's/oldtext/newtext/g' {}

grep -lr 'subdomainA.example.com' | while read file; do sed -i "s/subdomainA.example.com/subdomainB.example.com/g" "$file"; done

대부분의 사람들은 "읽는 동안 파일"에 무언가를 파이프로 연결할 수 있다는 것을 알지 못하고 파일 이름에 공간을 미리 구분하면서 이러한 지저분한 -print0 arg를 피할 수 있다고 생각합니다.

「 」의 추가echo할 수 있습니다.sed 사를 를 before before before before before before 。

이것을 시험해 보세요.

sed -i 's/subdomainA/subdomainB/g' `grep -ril 'subdomainA' *`

이 블로그 투고에 따르면:

find . -type f | xargs perl -pi -e 's/oldtext/newtext/g;'
#!/usr/local/bin/bash -x

find * /home/www -type f | while read files
do

sedtest=$(sed -n '/^/,/$/p' "${files}" | sed -n '/subdomainA/p')

    if [ "${sedtest}" ]
    then
    sed s'/subdomainA/subdomainB/'g "${files}" > "${files}".tmp
    mv "${files}".tmp "${files}"
    fi

done

you면면면면면을 사용해도 vim grep ★★★★★★★★★★★★★★★★★」find은 이 링크에서 사용자 Gert에 의해 제공된 답변을 확인할 수 있습니다.-> 폴더 계층에서 텍스트 치환을 수행하는 방법

이게 조건이다:

  • GREP' (은 (')가 .$(grep 'string' 'pathname' -Rl).

  • ( 이러한 경우는,과 같이 할 수도 ( ) 일 、 [ ] 、 [ ] 、 [ ] 、 음음 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 。cp -iv $(grep 'string' 'pathname' -Rl) 'centralized-directory-pathname'

  • 그바바바/ after바 、 바바 / 꾸바바바 after 。vim다음 링크에서 제공되는 것과 유사한 방식을 따릅니다.

    • :bufdo %s#string#replacement#gc | update

다음과 같이 awk를 사용하여 해결할 수 있습니다.

for file in `find /home/www -type f`
do
   awk '{gsub(/subdomainA.example.com/,"subdomainB.example.com"); print $0;}' $file > ./tempFile && mv ./tempFile $file;
done

이것이 당신에게 도움이 되길 바랍니다!!!

git 저장소의 모든 항목을 바꾸려면 다음을 사용할 수 있습니다.

git ls-files -z | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'

로컬 git repo에 파일 나열을 참조하십시오.저장소의 모든 파일을 나열하는 기타 옵션입니다.-z에 의해, 옵션 「git」의 「0」이 됩니다.이것에 의해, 다음의 것이 보증됩니다.xargs)-0는 공백 을 구분할 수

SVN 저장소를 완전히 파괴하지 않고 이 기능을 사용하려면 다음을 수행하여 숨겨진 모든 파일을 무시하도록 '찾기'를 지시할 수 있습니다.

find . \( ! -regex '.*/\..*' \) -type f -print0 | xargs -0 sed -i 's/subdomainA.example.com/subdomainB.example.com/g'

조금 구식이지만 OS X에서는 동작했습니다.

몇 가지 속임수가 있습니다.

• 한다. • 확장자를 가진 파일만 편집한다.sls

. 빠져나가야 .sed은 ' 캐릭터하지 않습니다.

,.sed인 "Delimiter"가 아닌 ""를 합니다./

하여 진자 템플릿을 것입니다.variable의 경로로import(서양속담, 서양속담)

먼저 sed 명령어가 원하는 기능을 수행하는지 확인합니다(이 명령어는 stdout으로 변경 내용을 출력할 뿐 파일은 변경되지 않습니다).

for file in $(find . -name *.sls -type f); do echo -e "\n$file: "; sed 's,foo\.bar,foo/bar/\"+baz+\"/,g' $file; done

변경할 준비가 되면 필요에 따라 sed 명령을 편집합니다.

for file in $(find . -name *.sls -type f); do echo -e "\n$file: "; sed -i '' 's,foo\.bar,foo/bar/\"+baz+\"/,g' $file; done

해 주세요.-i ''sed 명령에서는 원본 파일의 백업을 만들고 싶지 않았습니다(OS X의 sed를 사용한 내부 편집 또는 이 페이지의 Robert Lujo 코멘트 참조).

행복한 씨뿌리개 여러분!

단지 변화를 피하기 위해

  • NearlysubdomainA.example.com
  • subdomainA.example.comp.other

그래도

  • subdomainA.example.com 를 참조해 주세요.좋습니까?

(도메인 루트의 배후에 있는 아이디어에서는 좋지 않을 수 있습니다)

find /home/www/ -type f -exec sed -i 's/\bsubdomainA\.example\.com\b/\1subdomainB.example.com\2/g' {} \;

대부분의 더. 이 은 필요하지 find(사용)du를를 、 를예 、 들를 。「」가합니다.xargs플랜 9의 일부 버전(9프론트 등)에서만 볼 수 있습니다.

 du -a | awk -F' '  '{ print $2 }' | xargs sed -i -e 's/subdomainA\.example\.com/subdomainB.example.com/g'

등의 는, 「」를 사용합니다.grep:

 du -a | grep "\.scala$" | awk -F' '  '{ print $2 }' | xargs sed -i -e 's/subdomainA\.example\.com/subdomainB.example.com/g'

IBMi의 Qshell(qsh)의 경우 OP에 의해 태그된 bash가 아닙니다.

qsh 명령어의 제한:

  • find에는 -print0 옵션이 없습니다.
  • xargs에는 -0 옵션이 없습니다.
  • sed에는 -i 옵션이 없습니다.

따라서 qsh의 솔루션은 다음과 같습니다.

    PATH='your/path/here'
    SEARCH=\'subdomainA.example.com\'
    REPLACE=\'subdomainB.example.com\'

    for file in $( find ${PATH} -P -type f ); do

            TEMP_FILE=${file}.${RANDOM}.temp_file

            if [ ! -e ${TEMP_FILE} ]; then
                    touch -C 819 ${TEMP_FILE}

                    sed -e 's/'$SEARCH'/'$REPLACE'/g' \
                    < ${file} > ${TEMP_FILE}

                    mv ${TEMP_FILE} ${file}
            fi
    done

경고:

  • 솔루션에서 오류 처리 제외
  • OP에 의해 태그된 Bash가 아님

「」의 grep ★★★★★★★★★★★★★★★★★」sed

for pp in $(grep -Rl looking_for_string)
do
    sed -i 's/looking_for_string/something_other/g' "${pp}"
done
perl -p -i -e 's/oldthing/new_thingy/g' `grep -ril oldthing *`

을 "백업"으로 하다)*.bak

perl -p -i -e "s/\|/x/g" *

해, 「」를 치환합니다.|" pie합니다.펄파이(Perl pie)

언급URL : https://stackoverflow.com/questions/1583219/how-can-i-do-a-recursive-find-replace-of-a-string-with-awk-or-sed

반응형