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 のより多くの構成)。${
$(
$
grep
d$
$
$PATH
$fioejsfoeij
$-
$$
${…}
$(…)
$((…))
$[…]
シェル拡張に関する完全なルールは複雑すぎて、1つまたは2つの記事で説明できません。実際には、一般的なケースを覚えておくだけで十分です。
\
(バックスラッシュ) 改行文字でない限り、次の文字を引用し、バックスラッシュは常に削除されます。'…'
(一重引用符)は、'
自分以外のすべての文字を引用します。"…"
(二重引用符)はを除くすべての文字を引用し"$\`
、\
二重引用符内にある場合は次の文字が文字通り解釈され、次の文字が特殊な場合にのみ削除されます。
答え2
最初に\<
シェルによってエスケープされると、その値はリテラル<
文字になります。したがって、渡される正規表現は特別な意味のないgrep
文字列です。<H
この特定の関係についてもっと知りたい場合は、Gilesの答えを確認する必要があります。