簡単なテストPHPスクリプトがあるとしましょう。
<?php
$a = ($argc == 2 ? $argv[1] : 10);
for ($i = 0; $i < $a; $i++) {
echo '.';
}
echo PHP_EOL;
これで、ファイルに対してgrepまたは条件付きsedを実行します。
grep '<' test.php
含まれている2行を作成します<
。非常に明確です。
grep '\?' test.php
疑問符を含む2行を生成します。非常に明確です。
grep '<\?' test.php
すべての行を返します。なぜですか?最初の行だけを出力すると予想しました。しかし、<
エスケープする必要があるかもしれません。これにより、予期しない別の出力が生成される可能性があります。
sed -n '/pattern/p' test.php
同じ結果が生成されます。
私はから答えを得ようとしています。https://regex101.com/しかし、驚くべきことに、ウェブサイトには私が期待した内容が出ていました。また、grep
私が期待した結果を生成した高速で汚れたPHPの実装は次のとおりです。
<?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
したがって、所望の結果を得ることができる。
GNUはgrep
拡張正規表現では特別な意味を持ちますが、BREではそうでないシンボルのエスケープバージョンを扱います。BREでも特殊記号で、これは\?
EREとBREで同じ意味を持ちます。?
したがって、grep '<\?'
0または1と一致すると、<
すべての項目と一致します(<
またはカラー出力が有効な場合は強調表示されます)。
同じ推論が適用されます。sed
。