egrep 搜索文件内容时忽略空格

egrep 搜索文件内容时忽略空格

这是我的语法:

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

我直接从控制台/终端使用它(无脚本)。

有点无用 - 包含大约 200 个网站的整个服务器已从 cPanel 迁移到 Plesk。新服务器上未激活/支持简写打开 PHP 标记,并且在各个网站上导致偶尔出现错误。我以为我可以通过将搜索结果转储到文件中来解决问题,但该命令忽略了后面的空白<?,并返回了每个 *.php 文件(我不需要)。

如何egrep返回<?其中包含的所有 *.php 文件?

答案1

您正在使用的正则表达式<?egrep扩展正则表达式 (ERE) 一起使用。在 ERE 中,?表示“前面的字符出现 1 或 0 次”,因此您的正则表达式表示:“查找零个或一个<后跟空格”。换句话说,查找所有空格,包括<.为了使用文字?,您需要对其进行转义 ( grep -E '<\? ')。

或者,不要在此处使用egrepegrep无论如何已弃用,请使用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' {} +

相关内容