GNU grep正規表現で引用符を使用する

GNU grep正規表現で引用符を使用する

GNU Grepのいくつかのパターンは括弧で囲むことができますが、他のパターンはそうではありません。たとえば、単語の先頭の一致は、単語が引用符で囲まれている場合にのみ機能します。

user@host:~/Desktop$ grep -E '\<H' test
Hello World
user@host:~/Desktop$ grep -E \<H test

[テストにはHello World文字列が含まれています。]

ただし、ファイルの終わりと開始を一致させるのに費用は必要ありません。

user@host:~/Desktop$ egrep d$ test
Hello World

なぜですか?ルールは何ですか?

答え1

引用符はシェルによって拡張され、grep表示される内容を決定します。

の場合、grep -E '\<H'一重引用符の間の文字は文字通り渡されるため、grepは\<H単語の先頭にアンカーを含む正規表現をチェックします\<

バックスラッシュ文字を使用すると、grep -E \<Hシェルから特別な意味が削除され、正規表現が表示されます。このような行に一致する項目が表示されます。<grep<H<Hello>

を使用すると、grep -E <Hこの<文字はシェルからリダイレクト文字として特別な意味を持ち、grep標準入力から呼び出されたファイルの内容を受け取ります。H

grep 'd$'orを使用すると、grep d\$ドル記号が引用され、次のようになりますgrep。正規表現はで、行末のaとd$一致します。d

grep d$ test記号の後に有効な変数名や有効な句読点(、)$はありません。これが発生すると、シェルはシンボルを文字通り渡すので、正規表現を再び見ることができます。拡張は、有効な変数名が続く場合にのみ発生します(変数が定義されていない場合でも重要なのは、orなどの名前、またはorなどの単一文字変数が続くことです)。または struct 、 、 (また bash および zsh および zsh のより多くの構成)。${$($grepd$$$PATH$fioejsfoeij$-$$${…}$(…)$((…))$[…]

シェル拡張に関する完全なルールは複雑すぎて、1つまたは2つの記事で説明できません。実際には、一般的なケースを覚えておくだけで十分です。

  • \(バックスラッシュ) 改行文字でない限り、次の文字を引用し、バックスラッシュは常に削除されます。
  • '…'(一重引用符)は、'自分以外のすべての文字を引用します。
  • "…"(二重引用符)はを除くすべての文字を引用し"$\`\二重引用符内にある場合は次の文字が文字通り解釈され、次の文字が特殊な場合にのみ削除されます。

答え2

最初に\<シェルによってエスケープされると、その値はリテラル<文字になります。したがって、渡される正規表現は特別な意味のないgrep文字列です。<H

この特定の関係についてもっと知りたい場合は、Gilesの答えを確認する必要があります。

関連情報