파일에서 일치하는 모든 문자열을 재귀적으로 바꾸는 방법은 무엇입니까?

파일에서 일치하는 모든 문자열을 재귀적으로 바꾸는 방법은 무엇입니까?

폴더 이름 site 아래에 약 50개의 HTML/js 파일이 있습니다.

일부 파일에는 다음이 포함됩니다(다음 줄은 파일에서 조합됨)

    {"rendered":"http:\/\/localhost:4542\/?page_id=854"}
                 http:\/\/localhost:4542\/wp-content\/uploads\/2022\/09\/
           src=\"http:\/\/localhost:4542\/wp-content\/uploads\/2022\/09\/B
                 http:\/\/localhost:4542\/wp-content\/uploads\/2022\/09\/A
replies":[{"embeddable":true,"href":"http:\/\/localhost:4542\/en\/wp-json  

폴더의 모든 파일을 반복적으로 바꿀 수 있는 도구/명령이 있습니까 http:\/\/localhost:4542?https:example.com

이제 macOS에서 작업 중입니다.

답변1

가지고 다닐 수 있는:

LC_ALL=C find . '(' -name '*.[Jj][Ss]' -o \
                    -name '*.[Hh][Tt][Mm][Ll]' -o \
                    -name '*.[Hh][Tt][Mm]' \
                ')' -exec perl -pi -e '
  s{\Qhttp:\/\/localhost:4542\E}{https:example.com}g' {} +

대체할 파일이 전혀 없는 파일을 다시 작성하게 된다는 점에 유의하세요.

GNU grep/ xargs또는 호환 가능(여기서는 과도한 입력을 피하기 위해 중괄호 확장을 지원하는 셸)의 경우 다음을 통해 이를 피할 수 있습니다.

LC_ALL=C grep -r --include='*.'{'[jJ][sS]','[Hh][Tt][Mm]'{,'[Ll]'}} \
  -Fl --null 'http:\/\/localhost:4542' . |
  xargs -r0 perl -pi -e '
    s{\Qhttp:\/\/localhost:4542\E}{https:example.com}g'

큰 피해 없이 제거할 수 있는 옵션(파일을 찾을 수 없는 경우 Perl 경고만 표시) 외에도 -rGNU API의 대부분을 복사하는 Macos에서도 작동합니다.xargsgrepgrep

답변2

find매개변수와 함께 명령을 사용해 볼 수 있습니다 -exec.

find /path/to/folder -type f -regex '.*\.\(js\|html\)' -exec sed -i 's#http:\\/\\/localhost:4542#https:example.com#g' {} +

Mac OS에서는 비슷한 구문을 사용할 수 있습니다.

find /path/to/folder -E -type f -regex '.*\.(js|html)' -exec sed -i '.bak' 's#http:\\/\\/localhost:4542#https:example.com#g' {} +

정말 작동하길 바랍니다. 테스트할 Mac이 없지만 작동할 것입니다. Mac OS에서는 -i이 옵션을 지정할 때 파일 확장자를 백업해야 합니다. ".bak" 대신 어떤 값이든 사용할 수 있습니다.

신용 거래:

find 명령을 사용하여 여러 확장자를 검색하는 방법,

Mac에서 -i 옵션이 포함된 sed 명령이 실패함

노트:이 코드가 Mac OS에서 작동하는지 확실하지 않지만 다음과 같이 시도해 볼 수도 있습니다.

find /path/to/folder -iname "*.html" -o -iname "*.js" -exec sed -i 's#http:\\/\\/localhost:4542#https:example.com#g' {} +

답변3

특정 폴더(예:)에서 특정 유형(예:)의 모든 파일을 find찾은 다음 다음 을 사용하여 명령에 공급할 수 있습니다 .*.txt.sedxargs

find .  -type f -name '*.txt' -print0 | xargs -0 sed -i 's/http:\\\/\\\/localhost:4542/https:example.com/g'

위의 슬래시가 이스케이프되어 있음을 참고하세요.

관련 정보