带有“

带有“

假设有一个简单的测试 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

答案1

grep的默认行为是将正则表达式解释为基本正则表达式(BRE)。这些不支持?作为特殊符号;这是基本特征:

grep '<?' test.php

从而给出您期望的结果。

GNUgrep处理在扩展正则表达式中具有特殊含义但在 BRE 中不具有特殊含义的符号的转义版本作为特殊符号,即使在 BRE 中也是如此:因此在 BRE 中,与ERE 中\?具有相同的含义。?因此grep '<\?'匹配零或一<,它匹配所有内容(<如果启用了颜色输出,则突出显示)。

同样的推理也适用于sed

相关内容