使い方を探すべきです。ショートオープンラベルPHPファイルでは、これは一致する<?
が一致しないことを<?php
意味します。ほとんどの正規表現スタイルでは、次のようになります。<?xml
<?=
<\?(?!php|xml|=)
しかし、次の行は望ましくない<?php
、<?xml
および<?=
部分と一致します。
$ grep -r -E "<\?(?\!php|=|xml)" *
私はバックスラッシュ-P
と-e
フラグのさまざまな順列を試しました。GNU grepで否定的な予測を正しく使用する方法は?
セントOS 7.3(KDE デスクトップ),GNU grep 2.20(オンライン文書は3.0用ですが、man
ローカルにあります。)ネスレデカフェインコーヒー(実際にはそうかもしれません。本物質問)。
答え1
Perl否定予測を-P
実装するにはPCREが必要です。(?!...)
いいえ脱出しました。!
(?!...)
-bash-4.2$ cat input
<?php
<?xml
<?=
<?okay
<?
-bash-4.2$ grep -P '<\?(?!php|xml|=)' input
<?okay
<?
-bash-4.2$
"<\?(?\!php|=|xml)"
(?\!...)
正規表現エンジンに渡され、正規表現エンジンとまったく関係がないため、正しくありませんgrep
。?\!
シェル?!
がプログラムに何を渡すかわからない場合は、確認するためにいくつかのコードを書いてください。
$ perl -E 'printf "%*vd\n","\t",$ARGV[0];say join "\t",split //,$ARGV[0]' "?\!"
63 92 33
? \ !
$
または、次のものを使用して何が得られるかをstrace
確認してください。grep
-bash-4.2$ strace -o grep grep "?\!grep" /etc/passwd
-bash-4.2$ grep grep grep
execve("/usr/bin/grep", ["grep", "?\\!grep", "/etc/passwd"], [/* 24 vars */]) = 0
-bash-4.2$