Limites da palavra Grep

22

De acordo com a documentação do GNU:

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

Meu / etc / fstab fica assim:

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

Quero que o grep retorne TRUE / FALSE pela existência de / media / fresh. Eu tentei usar \<e \>mas não funcionou. Por quê?

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

Solução alternativa:

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

Mas parece mais feio.

Meu grep é 2.5.1

Felipe Alvarez
fonte
4
Suponho que /não seja considerado um caractere de palavra, portanto, regex não corresponderá - "\ b corresponde antes e depois de uma sequência alfanumérica" ​​é mais exato do que dizer "antes e depois de uma palavra"
Felipe Alvarez

Respostas:

27

\<e \>corresponder a sequência vazia no início e no final de uma palavra, respectivamente, e apenas os caracteres constituintes da palavra são:

[[:alnum:]_]

De man grep:

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

Portanto, seu Regex está falhando porque /não é um caractere válido da palavra constituinte.

Em vez disso, como você tem espaços, pode usar a -wopção de greppara corresponder uma palavra:

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

Exemplo:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh
heemail
fonte
Eu imagino isso depois de postar minha pergunta. Alguma sugestão para o que eu quero alcançar?
Felipe Alvarez
@FelipeAlvarez Confira minhas edições ..
heemayl
1

Esse problema com \<(e também \b) se aplica não apenas a /, mas a todos os caracteres que não sejam palavras. (ou seja, caracteres diferentes de [[:alnum:]]e _.)

O problema é que o mecanismo regex sempre ignora um caractere que não seja da palavra, como /na pesquisa da próxima âncora \<. É por isso que você não deve colocar caracteres que não sejam palavras como /depois \<. Se o fizer, por construção, nada corresponderá.

Uma alternativa à -wopção do grep seria algo como isto:

egrep "(^|\W)/media/fresh($|\W)"
SE
fonte