grepは\ $をどのように解釈しますか?


回答:


18

シェルが解釈さ\$としてはgrepにそれを通過$行末文字、。だからあなたの行に終わりがあると仮定すると、それはマッチします:-)

$grepの実際の値と一致させる場合は、次のいずれかを使用します。

grep \\\$
grep '\$'

前者では、シェルの解釈\\など\\$として$与えます\$。後者では、まったく解釈しません。


なぜ\$2文字のシーケンスではなくドル記号と一致するのかという質問については、使用されるような正規表現grepはいくつかの目的で特殊文字を使用します。それらのいくつかは次のとおりです。

$       end of line
^       start of line
.       any character
+       1 or more of the preceeding pattern
*       0 or more of the preceeding pattern
{n,m}   between n and m of the preceeding pattern
[x-y]   any character between x and y (such as [0-9] for a digit).

他の多くの人と一緒に。

通常は特殊文字として扱われるリテラ文字と一致させたい場合は、それをエスケープgrepして通常の文字として扱う必要があります。


1
grepの表示内容をテストするには、試しecho \$てからecho \\$

先ほど述べたように、grep \\\ $では、\ $がgrepに渡されるため、\ $を含む文字列と一致するはずですが、なぜ$のみを含む文字列と一致するのですか?

grepの$は行末を意味するためです。文字$に一致させるには、grepが特別に処理しないようにエスケープする必要があります。私の更新を参照してください。

@Pasi:echoは、シェルの組み込みかどうか、POSIX準拠かどうかなどに応じて、独自のアンエスケープをls \$実行します。 \ $は$にエスケープされていないが、\\ $は\ $にエスケープされていないことがわかります。
辺野

5

シェルは最初にエスケープシーケンスを展開してから引数をプログラムに渡します。そのため、シェル\$はエスケープシーケンスとして解釈し、行末に一致する単一の引数$をに渡しgrepます。すべての行に終わりがあるため、すべての行が一致する必要があります:)


しかし、行末はどのようになっていますか?行末は\ nではありませんか?

2
@Happy Mithal:参照man grep; その決定された$にかかわらず、ラインがで区切られているか否かの、行の末尾にマッチし\n\r全く異なる、両方、または何か。一般的な場合、正規表現は「行」だけでなく任意の文字列との一致に使用でき$、文字列の末尾との一致に使用されます。

2

行末のメタキャラクターとして解釈されています。実際のドル記号と一致させたい場合は、

 $ grep \\$ 

または

 $ grep '\$' 

1

^文字列の開始と$終了です。

grep \$

または

grep $

すべての文字列に一致するため、入力した内容はすべてエコーバックされます。

試してみる

grep a$

これで、最後の文字がa一致する文字列のみが一致してエコーされます。


1

$文字クラスに正規表現を使用することで、リテラルを検索する場合のエスケープの手間を省くことができます。例えば、

$ grep '[$]' file
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.