假设,有一个简单的测试 PHP 脚本:
<?php
$a = ($argc == 2 ? $argv[1] : 10);
for ($i = 0; $i < $a; $i++) {
echo '.';
}
echo PHP_EOL;
现在,我对文件执行 grep 或条件 sed:
grep '<' test.php
产生包含<
. 这很清楚。
grep '\?' test.php
产生包含问号的两行。这很清楚。
grep '<\?' test.php
返回所有行 - 为什么?我希望它只输出第一行。但也许,<
应该转义,这会产生另一个意想不到的输出。
sed -n '/pattern/p' test.php
产生相同的结果。
我试图在https://regex101.com/上获得答案,但令我惊讶的是,该网站显示了我的期望。此外,一个快速而肮脏的 PHP 实现grep
产生了我所期望的:
<?php
if (($fh = fopen($argv[2], 'r')) !== false) {
while ($line = fgets($fh)) {
if (mb_ereg($argv[1], $line) !== false) echo $line;
}
}
grep
我的问题是:和中的这些匹配背后的原因是什么sed
?
grep
的默认行为是将正则表达式解释为基本正则表达式(BRE)。这些不支持?
作为特殊符号;这是基本字符:因此给出了您期望的结果。
GNU
grep
将在扩展正则表达式中具有特殊含义但在 BRE 中没有的符号的转义版本视为特殊符号,即使在 BRE 中也是如此:因此在 BRE 中,与 ERE 中的\?
含义相同?
。所以grep '<\?'
匹配 zero 或 one<
,它匹配所有内容(<
如果您启用了颜色输出,则突出显示)。同样的推理也适用于
sed
。