这是我的语法:
egrep -lir --include="*.php" '<? ' > ./wrongtag.txt
我直接从控制台/终端使用它(无脚本)。
有点无用 - 包含大约 200 个网站的整个服务器已从 cPanel 迁移到 Plesk。新服务器上未激活/支持简写打开 PHP 标记,并且在各个网站上导致偶尔出现错误。我以为我可以通过将搜索结果转储到文件中来解决问题,但该命令忽略了后面的空白<?
,并返回了每个 *.php 文件(我不需要)。
如何egrep
返回<?
其中包含的所有 *.php 文件?
答案1
您正在使用的正则表达式<?
与egrep
扩展正则表达式 (ERE) 一起使用。在 ERE 中,?
表示“前面的字符出现 1 或 0 次”,因此您的正则表达式表示:“查找零个或一个<
后跟空格”。换句话说,查找所有空格,包括<
.为了使用文字?
,您需要对其进行转义 ( grep -E '<\? '
)。
或者,不要在此处使用egrep
(egrep
无论如何已弃用,请使用grep -E
),因为没有您真正想要使用的扩展正则表达式功能。所以,试试这个:
grep -lr --include="*.php" '<? ' > ./wrongtag.txt
我还删除了,-i
因为您的模式中没有字母,因此没有任何字母可以是小写或大写。
最后,如果您想要从所有 php 文件中删除这些标签,您可以简单地使用 sed 一步完成并查找:
find . -name '*.php' -exec sed -i.bak 's/<? //' {} +
这将为每个文件(foo.php
将成为foo.php.bak
)制作一个备份副本,并从原始文件中删除标签。如果您只想删除包含该标签的整行(我相信 php 认为标签是该行上的唯一内容,对吗?),您可以删除除该标签外没有其他内容的所有行:
find . -name '*.php' -exec sed -i.bak '/^ *<? *$/d' {} +