필요한 모든 파일을 찾기 위해 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"는 전역 교체를 위한 것이고, 그렇지 않으면 각 줄의 첫 번째 것입니다.