이것은 내 구문입니다.
egrep -lir --include="*.php" '<? ' > ./wrongtag.txt
콘솔/터미널에서 직접 사용합니다(스크립팅 없음).
쓸모가 없습니다. 약 200개의 웹 사이트가 포함된 전체 서버가 cPanel에서 Plesk로 이동되었습니다. 속기형 개방형 PHP 태그는 새 서버에서 활성화/지원되지 않으며 다양한 웹사이트에서 가끔 오류가 발생합니다. 검색 결과를 파일에 덤프하면 문제를 해결할 수 있다고 생각했지만 명령은 후행 공백을 무시 <?
하고 모든 *.php 파일(필요하지 않음)을 반환합니다.
그 안에 포함된 모든 *.php 파일을 어떻게 egrep
반환 할 수 있나요?<?
답변1
사용 중인 정규식은 확장 정규식(ERE) <?
과 함께 사용됩니다. egrep
ERE에서는 ?
"이전 문자가 1번 또는 0번 발생함"을 의미하므로 정규식은 "0 또는 1 <
뒤에 공백이 오는 항목 찾기"를 의미합니다. 즉, <
리터럴을 사용하려면 공백 ?
을 모두 찾아야 합니다( grep -E '<\? '
).
또는 실제로 사용하려는 확장 정규식 기능이 없으므로 여기에서 사용하지 마십시오 egrep
( egrep
더 이상 사용되지 않으므로 어쨌든 사용하십시오 ). grep -E
따라서 다음을 시도해 보십시오.
grep -lr --include="*.php" '<? ' > ./wrongtag.txt
-i
패턴에 글자가 없기 때문에 소문자나 대문자가 될 수 없는 글자 도 제거했습니다 .
마지막으로 모든 PHP 파일에서 이러한 태그를 제거하려면 sed 및 find를 사용하여 한 단계로 간단히 수행할 수 있습니다.
find . -name '*.php' -exec sed -i.bak 's/<? //' {} +
이렇게 하면 각 파일의 백업 복사본이 만들어지고( foo.php
파일이 됨 foo.php.bak
) 원본 파일에서 태그가 제거됩니다. 태그가 포함된 전체 줄을 삭제하고 싶다면(PHP는 태그가 줄의 유일한 것이라고 생각한다고 생각합니다. 그렇죠?) 태그 외에는 아무것도 없는 줄을 모두 삭제할 수 있습니다.
find . -name '*.php' -exec sed -i.bak '/^ *<? *$/d' {} +