正規表現パターン"?!"がgrepを使用しないのはなぜですか? [コピー]

正規表現パターン"?!"がgrepを使用しないのはなぜですか? [コピー]

-vファイルから単一の単語を除外するために使用できますが、正規表現パターンが/?!で機能しない理由は疑問に思います。grepegrep

エディタでファイル検索から単一の単語を除外するパターンを見つけてatom発見しました。これ協会。この?!機能はで完全に機能しますatombashまず閉じる必要があります。histexpandそれ以外の場合はset +H検索履歴が表示されます-bash: !xxx: event not found。その後!pattern、同様のことを試しましたが、パターンを認識できませんでした。なぜこれが起こるのですか?echo "no" | grep "^(?!yes).*"grep?!

答え1

$ echo "no" | grep -P '^(?!yes).*'
no

この式は、標準の基本正規表現や標準拡張正規表現ではなく、「Perl Compatible Regular Expression」を意味するPCREです。フラグでユーティリティを使用すると、GNUはgrepこれについて知っています-P

式を一重引用符で囲むと(静的文字列なので、そうする必要があります)、拡張パターンは履歴パターンとしてbash認識されません?!yes

GNUgrepマニュアルから:

-P--perl-regexp

パターンをPerl互換正規表現(PCRE)として解釈します。これは実験的で実装grep -Pされていない機能について警告できます。

bashマニュアルで(私の強調):

\バックスラッシュ()のみそして一重引用符歴史的な拡張文字は引用符で囲むことができますが、二重引用符で囲まれた文字列で閉じる二重引用符の直前にある場合でも、引用符と見なされます。

関連情報