grep으로 찾은 모든 파일의 문자열을 바꿉니다. 작동시킬 수 없습니다

grep으로 찾은 모든 파일의 문자열을 바꿉니다. 작동시킬 수 없습니다

필요한 모든 파일을 찾기 위해 grep을 사용했습니다.grep --include=\*.{php,ini,conf,sh} -ril -P "'([\d\w\-\_\.]+)(@domain.com)'" '/var/www_data/somepath/'

이제 교체 프로세스를 수행하기 위해 sed 또는 Perl을 사용한다고 가정합니다. 불행히도 둘 중 하나에서 위 정규식을 사용하는 방법을 알 수 없습니다. 나는 보았다이 방법그리고이 방법하지만 내가 말했듯이 내 패턴에서는 작동하도록 할 수 없습니다(명령을 실행한 후 다음 줄에 >가 표시된다는 의미입니다. sed 또는 Perl과 함께 사용할 때 위에 표시된 정규식에 문제가 있는 것 같습니다) , 따라서 이 문제에 대한 조언이 있으면 좋을 것입니다.

또한 가능한지 모르겠지만(별로 중요하지 않음) 교체가 발생하는 각 파일에 대해 일부 문자열을 인쇄하고 싶습니다. 예를 들어 File fixed: /path/to/file/(grep 목록에서 파일 이름을 얻을 수 있을까요?)

답변1

일반적으로 을 클릭한 후 다음 줄에 표시되면 >제안 중 하나가 아직 종료되지 않았음을 의미합니다. 정규식에서 이 오류를 찾을 수 없습니다. 하지만 /var/www_data/somepath/경로를 작은따옴표로 묶을 필요는 없습니다 . 에는 특이한 캐릭터가 없는 것 같은데요 somepath?

어쨌든 sed로 정규식을 테스트했습니다. 나에게는 구문 \d\w처럼 보입니다 vim. 그래서 나는 그것을 ASCII로 번역했습니다(항상 작동합니다). 또한 []마음이 탈출할 필요도 없습니다 ..

sed -r "s/'([A-Za-z0-9_-.]+)(@domain.com)'/'adsf'/g" test.dat

실제로 작업을 수행하기 위해 sed또는 를 사용할 수 있습니다. 기가바이트 단위의 데이터가 없으면 파일 목록을 perl반드시 생성할 필요가 없습니다 . grep그러면 사전 분류를 통해 속도 이점을 얻을 수 있습니다.

당신의 테스트정규식, 다음을 수행할 수 있습니다.

cd /var/www_data/somepath/
sed -r 's|pattern|replace-pattern|g' a_single_file.php

결과가 만족스러우면 -ibak( --in-place=bak) 매개변수를 추가하고 모든 파일에 대해 실행하세요.

find . -type f -name '*.php' -o -name '*.ini' -o name '*.conf' -o -name '*.sh' \
-exec sed -r -ibak 's|pattern|replace-pattern|g' '{}' \; 

원본 파일을 에 넣는 중입니다 <orignalname.php>.bak.

마지막 질문에 답하기 위해. 이 작업을 위해 위의 sed로 생성된 파일에서 실행할 수 있는 grep도구가 필요합니다 ..bak

grep --recursive --include='*.bak' -E --files-with-matches 'pattern' . > files_fixed.txt

또는 간단하게:

find . -type f -name '*.bak'

답변2

GNU를 sed사용하면 sed -i.

sed -i 'script' *.{php,ini,conf,sh}

답변3

대부분의 리눅스:

sed -i 's#FIND#REPLACE#g' *.{php,ini,conf,sh}

MacOS의 경우:

sed -i '' 's#FIND#REPLACE#g' *.{php,ini,conf,sh}

MacOS의 sed에는 -i 뒤에 백업 매개변수가 필요합니다. 파일을 백업할 필요가 없으면 빈 문자열을 사용하세요. "g"는 전역 교체를 위한 것이고, 그렇지 않으면 각 줄의 첫 번째 것입니다.

관련 정보