Usare grep per cercare una stringa che contiene un punto


196

Sto cercando di cercare una stringa 0.49(con punto) usando il comando

grep -r "0.49" *

Ma quello che sta succedendo è che sto ottenendo anche risultati indesiderati che contengono la stringa come 0449, 0949ecc. Il fatto è che Linux considera dot (.) Come qualsiasi personaggio e fa emergere tutti i risultati. Ma voglio ottenere il risultato solo per "0.49".

Risposte:


238

grepusa regex; .significa "qualsiasi personaggio" in una regex. Se si desidera una stringa letterale, utilizzare grep -F, fgrepo fuggire il .per \..

Non dimenticare di avvolgere la stringa tra virgolette doppie. Altrimenti dovresti usare\\.

Quindi, il tuo comando dovrebbe essere:

grep -r "0\.49" *

o

grep -r 0\\.49 *

o

grep -Fr 0.49 *

58
Avevo bisogno di fuggire due volte così \\.per farlo funzionare. Sto usando zsh.
Nikos Renieris,

5
@NikosRenieris hai avvolto la tua stringa grepping con doppie virgolette?
Justus Romijn il

@JustusRomijn Penso di averlo fatto, sì.
Nikos Renieris,

15
dovrai usarlo anche \\.per bash o usarlo "\."per sfuggire alla shell.
Tomofumi il

36

grep -F -r '0.49' *considera 0.49 come una stringa "fissa" anziché un'espressione regolare. Questo fa .perdere il suo significato speciale.


22

Devi scappare dal .as "0\.49".

A .è un meta-carattere regex per abbinare qualsiasi carattere (tranne la nuova riga). Per abbinare un periodo letterale, devi fuggire.



5

Puoi anche usare "[.]"

grep -r "0[.]49"

5

Ci sono così tante risposte che suggeriscono di sfuggire al punto, \.ma mi sono imbattuto in questo problema ancora e ancora: \.mi dà lo stesso risultato di.

Tuttavia, queste due espressioni funzionano per me:

$ grep -r 0\\.49 *

E:

$ grep -r 0[.]49 *

Sto usando una "normale" shell bash su Ubuntu e Archlinux.

Modifica o, secondo i commenti:

$ grep -r '0\.49' *

Nota, le virgolette singole fanno la differenza qui.


3
Devi citare la regex dalla shell o sfuggire alla barra rovesciata stessa in modo che la shell non la consumi. grep '\.'oppure grep \\.(consiglio vivamente il primo. Anche le virgolette doppie funzionano, come nella domanda originale; ma le virgolette singole sono più facili da capire e usare. Ad esempio, con virgolette doppie, in alcuni scenari sarebbe comunque necessario raddoppiare la barra rovesciata ).
Tripleee

IMHO, questa è la risposta più chiara e corretta, con il commento di @tripleee è la più completa. l'uso di [] (che funziona per rappresentare un sottoinsieme di caratteri a cui abbinare un singolo personaggio) è un bel trucco.
jringoot,

@jringoot Seriamente? Penso che questo non sia affatto chiaro - sembra più una domanda di follow-up da qualcuno che non aveva familiarità con la citazione.
Tripleee

È chiaro perché entrambe le espressioni funzionano direttamente e in effetti molti altri assumono la citazione o hanno bisogno di una doppia evasione per evitare che l'interpretazione secondaria da parte della shell sia banale. Non riesco più a modificare il commento (limite di 5 minuti). Il mio commento avrebbe potuto essere migliore: "questo, se combinato con il commento di @tripleee è la risposta più completa. Perché entrambi i comandi funzionano immediatamente e con la citazione è completa"
jringoot

1
Quello che di solito raccomando è "cita sempre singolarmente le tue espressioni regolari". Non è "completo", ma ottiene il lavoro svolto e implica che devi capire il preventivo o vivere secondo questa semplice regola.
Tripleee

4

Punto di fuga. Sarà il comando di esempio.

grep '0\.00'

4

Puoi sfuggire al punto e ad altri caratteri speciali usando \

per esempio. grep -r "0 \ .49"


Un promemoria per il futuro lettore, \.è necessario circondarsi di virgolette per farlo funzionare.
Frutta

1

Puoi anche cercare con - opzione che sostanzialmente ignora tutti i caratteri speciali e non sarà interpretata da grep.

$ cat foo |grep -- "0\.49"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.