grepを使用して、ドットが含まれている文字列を検索する


193

0.49コマンドを使用して文字列(ドット付き)を検索しようとしています

grep -r "0.49" *

しかし、何が起こっているのかというと04490949などの文字列を含む不要な結果も得られています。Linuxは、ドット(。)を任意の文字と見なしてすべての結果を引き出すLinuxです。でも「0.49」だけの結果を出したい。

回答:


233

grep正規表現を使用します。.正規表現では「任意の文字」を意味します。あなたは文字列リテラルをしたい場合は、使用grep -Ffgrepまたは脱出.\.

文字列を二重引用符で囲むことを忘れないでください。それ以外の場合は使用する必要があります\\.

したがって、コマンドは次のようにする必要があります。

grep -r "0\.49" *

または

grep -r 0\\.49 *

または

grep -Fr 0.49 *

58
それが機能するために、私はそのよう\\.に2回脱出する必要がありました。私はzshを使用しています。
Nikos Renieris 2017年

5
@NikosRenieris grepping文字列を二重引用符で囲みましたか?
Justus Romijn 2017年

@JustusRomijnそうだと思います。
Nikos Renieris 2017年

15
\\.bashにも使用"\."するか、シェルからエスケープするために使用する必要があります。
ともふみ2017

36

grep -F -r '0.49' *0.49を正規表現ではなく「固定」文字列として扱います。これは.その特別な意味を失います。


22

.としてエスケープする必要があり"0\.49"ます。

A .は、任意の文字(改行を除く)に一致する正規表現のメタ文字です。文字のピリオドに一致させるには、エスケープする必要があります。




4

エスケープドット。サンプルコマンドになります。

grep '0\.00'

4

\を使用すると、ドットやその他の特殊文字をエスケープできます

例えば。grep -r "0 \ .49"


それを機能させるには、将来の読者にリマインダーを\.引用符で囲む必要があります。
Fruit

4

ここにドットをエスケープすることを提案する非常に多くの答えがありますが\.、私はこの問題に何度も何度も遭遇しています:\.遭遇しています私に同じ結果を与えます.

ただし、次の2つの式は私にとってはうまくいきます。

$ grep -r 0\\.49 *

そして:

$ grep -r 0[.]49 *

UbuntuとArchlinuxで「通常の」bashシェルを使用しています。


3
シェルから正規表現を引用するか、バックスラッシュ自体をエスケープして、シェルがそれを消費しないようにする必要があります。grep '\.'またはgrep \\.(前者を強くお勧めします。元の質問と同様に、二重引用符も機能します。ただし、単一引用符の方が理解しやすく、使いやすいです。たとえば、二重引用符を使用しても、一部のシナリオではバックスラッシュを2倍にする必要があります。 )。
Tripleee

私見、これは最も明確な正解です。@ tripleeeのコメントが最も完全です。[](単一の文字と一致する文字のサブセットを表すために機能する)の使用は、素晴らしいハックです。
jringoot 2018

@jringootマジ?これはまったく明確ではないと思います-引用に慣れていない誰かからのフォローアップ質問のように見えます。
tripleee

両方の式が直接機能し、実際に多くの他の式が引用を想定するか、シェルによる二次的な解釈をささいなものとして回避するためにダブルエスケープする必要があるため、それは明らかです。コメントを変更できなくなりました(5分以内)。私のコメントはもっと良かったかもしれません:「これは、@ tripleeeのコメントと組み合わせると、それが最も完全な答えです。両方のコマンドがすぐに機能し、引用が完了するためです」
jringoot

1
私が通常お勧めするのは、「常に正規表現を一重引用符で囲む」ことです。それは「完全」ではありませんが、仕事を成し遂げるので、引用を理解する必要があるか、この単純なルールに従っている必要があることを意味します。
tripleee

0

-オプションを使用して検索することもできます。これは、基本的にすべての特殊文字を無視し、grepによって解釈されません。

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