Limiti di parole grep


22

Accedendo alla documentazione GNU:

‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.

Il mio / etc / fstab è simile al seguente:

/dev/sdb1       /media/fresh      ext2   defaults     0 0

Voglio grep per restituire VERO / FALSO per l'esistenza di / media / fresh. Ho provato a usare \<e \>ma non ha funzionato. Perché?

egrep '\</media/fresh\>' /etc/fstab

Soluzione:

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab

Ma sembra più brutto.

Il mio grep è 2.5.1


4
Suppongo che /non sia considerato un carattere di parola, quindi regex non corrisponderà - "\ b corrisponde prima e dopo una sequenza alfanumerica" ​​è più esatto del dire "prima e dopo una parola"
Felipe Alvarez

Risposte:


27

\<e \>abbina una stringa vuota all'inizio e alla fine di una parola rispettivamente e solo i caratteri costitutivi della parola sono:

[[:alnum:]_]

Da man grep:

Word-constituent characters are letters, digits, and the underscore.

Quindi, il tuo Regex sta fallendo perché /non è un carattere costituente parola valido.

Invece, avendo spazi intorno, puoi usare l' -wopzione di grepper abbinare una parola:

grep -wo '/media/fresh' /etc/fstab

Esempio:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh

Lo capisco anche dopo aver pubblicato la mia domanda. Qualche suggerimento per quello che voglio ottenere?
Felipe Alvarez,

@FelipeAlvarez Controlla le mie modifiche ..
heemayl

1

Questo problema con \<(e anche \b) si applica non solo a /, ma a tutti i caratteri non di parole. (ovvero caratteri diversi da [[:alnum:]]e _.)

Il problema è che il motore regex ignorerà sempre un carattere non verbale come /quando si cerca l'ancora successiva \<. Ecco perché non dovresti mettere caratteri non di parole come /subito dopo \<. Se lo fai, per costruzione, nulla corrisponderà.

Un'alternativa -wall'opzione di grep, sarebbe qualcosa del genere:

egrep "(^|\W)/media/fresh($|\W)"
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.