複数の文字列の否定的な予測

複数の文字列の否定的な予測

使い方を探すべきです。ショートオープンラベル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$ 

おすすめ記事