Verwenden Sie grep, um nach einer Zeichenfolge zu suchen, die einen Punkt enthält


193

Ich versuche 0.49mit dem Befehl nach einer Zeichenfolge (mit Punkt) zu suchen

grep -r "0.49" *

Aber was passiert ist , dass ich auch unerwünschte Ergebnisse zu erzielen , die die Zeichenfolge enthält wie 0449, 0949etc ,. Die Sache ist Linux, das Punkt (.) Als ein beliebiges Zeichen betrachtet und alle Ergebnisse hervorbringt. Aber ich möchte das Ergebnis nur für "0,49" erhalten.

Antworten:


233

grepverwendet reguläre Ausdrücke; .bedeutet "jedes Zeichen" in einem regulären Ausdruck. Wenn Sie eine Zeichenkette verwenden grep -F, fgrepoder fliehen die .zu \..

Vergessen Sie nicht, Ihre Zeichenfolge in doppelte Anführungszeichen zu setzen. Oder du solltest verwenden\\.

Ihr Befehl müsste also lauten:

grep -r "0\.49" *

oder

grep -r 0\\.49 *

oder

grep -Fr 0.49 *

58
Ich musste zweimal so fliehen, damit \\.es funktionierte. Ich benutze zsh.
Nikos Renieris

5
@NikosRenieris hast du deine Grepping-Zeichenfolge in doppelte Anführungszeichen gesetzt?
Justus Romijn

@ JustusRomijn Ich glaube schon, ja.
Nikos Renieris

15
Sie müssen auch \\.für Bash verwenden oder verwenden "\.", um es aus der Shell zu entkommen.
Tomofumi

36

grep -F -r '0.49' *behandelt 0,49 als "feste" Zeichenfolge anstelle eines regulären Ausdrucks. Dadurch .verliert es seine besondere Bedeutung.


22

Sie müssen dem .as entkommen "0\.49".

A .ist ein Regex-Metazeichen, das mit jedem Zeichen übereinstimmt (außer Zeilenumbruch). Um einer wörtlichen Periode zu entsprechen, müssen Sie ihr entkommen.




4

Escape-Punkt. Beispielbefehl wird sein.

grep '0\.00'

4

Sie können den Punkt und andere Sonderzeichen mit \ maskieren

z.B. grep -r "0 \ .49"


Eine Erinnerung an zukünftige Leser, \.umgeben von Anführungszeichen, ist notwendig, damit es funktioniert.
Obst

4

Es gibt hier so viele Antworten, die darauf hindeuten, dem Punkt zu entkommen, \.aber ich bin immer wieder auf dieses Problem gestoßen: \.gibt mir das gleiche Ergebnis wie.

Diese beiden Ausdrücke funktionieren jedoch für mich:

$ grep -r 0\\.49 *

Und:

$ grep -r 0[.]49 *

Ich verwende eine "normale" Bash-Shell unter Ubuntu und Archlinux.


3
Sie müssen den regulären Ausdruck aus der Shell zitieren oder den Backslash selbst umgehen, damit die Shell ihn nicht verbraucht. grep '\.'oder grep \\.(Ich würde das erstere dringend empfehlen. Doppelte Anführungszeichen funktionieren auch wie in der ursprünglichen Frage, aber einfache Anführungszeichen sind einfacher zu verstehen und zu verwenden. Bei doppelten Anführungszeichen müssten Sie beispielsweise in einigen Szenarien den Backslash noch verdoppeln ).
Tripleee

IMHO, dies ist die klarste richtige Antwort, mit dem Kommentar von @tripleee ist es die vollständigste. Die Verwendung von [] (das eine Teilmenge von Zeichen darstellt, mit denen ein einzelnes Zeichen übereinstimmt) ist ein netter Hack.
Jringoot

@ jringoot Ernsthaft? Ich denke, das ist überhaupt nicht klar - es sieht eher nach einer Folgefrage von jemandem aus, der mit Zitieren nicht vertraut war.
Tripleee

Es ist klar, weil beide Ausdrücke direkt funktionieren und tatsächlich viele andere das Anführungszeichen annehmen oder doppelt entkommen müssen, um eine sekundäre Interpretation durch die Shell als trivial zu vermeiden. Ich kann den Kommentar nicht mehr ändern (maximal 5 Minuten). Mein Kommentar könnte besser gewesen sein: "Dies ist in Kombination mit dem Kommentar von @tripleee die vollständigste Antwort. Da beide Befehle sofort funktionieren und das Zitat vollständig ist"
jringoot

1
Was ich normalerweise empfehle, ist "zitieren Sie Ihre regulären Ausdrücke immer in einfachen Anführungszeichen". Es ist nicht "vollständig", aber es erledigt die Arbeit und impliziert, dass Sie entweder das Zitieren verstehen oder nach dieser einfachen Regel leben müssen.
Tripleee

0

Sie können auch mit der Option - suchen, die im Grunde alle Sonderzeichen ignoriert und von grep nicht interpretiert wird.

$ cat foo |grep -- "0\.49"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.