egrep은 파일 내용을 검색할 때 공백을 무시합니다.

egrep은 파일 내용을 검색할 때 공백을 무시합니다.

이것은 내 구문입니다.

egrep -lir --include="*.php" '<? ' > ./wrongtag.txt

콘솔/터미널에서 직접 사용합니다(스크립팅 없음).

쓸모가 없습니다. 약 200개의 웹 사이트가 포함된 전체 서버가 cPanel에서 Plesk로 이동되었습니다. 속기형 개방형 PHP 태그는 새 서버에서 활성화/지원되지 않으며 다양한 웹사이트에서 가끔 오류가 발생합니다. 검색 결과를 파일에 덤프하면 문제를 해결할 수 있다고 생각했지만 명령은 후행 공백을 무시 <?하고 모든 *.php 파일(필요하지 않음)을 반환합니다.

그 안에 포함된 모든 *.php 파일을 어떻게 egrep반환 할 수 있나요?<?

답변1

사용 중인 정규식은 확장 정규식(ERE) <?과 함께 사용됩니다. egrepERE에서는 ?"이전 문자가 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' {} +

관련 정보