Consulta na Expressão Regular do Unix .. ao usar o comando grep

1

Hi,

I am not able to understand the complete functioning of period (.) operator in Regular Expression under unix terminal..

It says it matches any single character.. When i gave grep 'c.t' a.txt, it return results such as cat, cbt, cmt etc.. Should it pring any other type of data too??? as i am not clear with the basics of this period operator.

What if i give grep 'c[abm].t' a.txt, it is not giving the expected results i.e. I thought it should print only cat or cbt or cmt but it prints only caat, which was one of the data. Please clarify.

Além disso, se houver algum tutorial, em que eu possa dominar as habilidades de Expressão Regular, então, por favor, compartilhe .. Muito obrigado .. Por favor, tente resolver minha consulta ..

Obrigado.

    
por RBA 09.08.2009 / 18:13

4 respostas

3

O operador de período corresponde a qualquer caractere uma vez e apenas uma vez. Então, no seu primeiro exemplo, ele corresponde a um c seguido por um caractere que foi qualquer coisa seguido por um t.

No seu segundo exemplo, seu padrão é dito para combinar 4 e exatamente 4 caracteres. Eles são:

c

seguido por

[abm] - qualquer um desses

seguido por

- qualquer caractere único

seguido por

t

Quanto ao Regexes de aprendizado, confira aqui: link

    
por 09.08.2009 / 18:18
1

No seu exemplo, grep 'c [abm] .t' a.txt produzirá quaisquer linhas de um arquivo.txt que contenha pelo menos quatro caracteres que você especificar. a 'c', ou 'a', 'b' ou 'm', 'qualquer caractere' e, em seguida, 't'.

'c [abm] .t' corresponde:

cart
caat
ca%t
caNt
cm_t
moo cbqt this whole line is returned because it contains a match
rocbtt

etc, etc.

Espero que isso ajude você a entender seu exemplo.

Expressões regulares podem ser incrivelmente complexas. Eu não posso recomendar nada de improviso além do que eu encontraria e estaria olhando pela primeira vez agora.

Esteja ciente de que existem muitos tipos e implementações diferentes, do grep (egrep / grep -E) ao perl, ao php, ao Javascript, etc.

Enquanto você brinca com eles, você se verá tendo que lembrar de escapar de algumas coisas da sua shell, e extrair outras coisas da própria regex ... onde você quer combinar um literal '.' (período), você precisaria grep 'moo\.' para corresponder a 'moo'. e não 'moof'

O livro Mastering Regular Expressions da O'Reilly é considerado bastante definitivo.

    
por 09.08.2009 / 18:20
0

O operador de período corresponde a qualquer caractere, exatamente como a descrição diz. Então, 'c.t' corresponderá a 'cat', 'cbt', 'cct' ... 'czt', 'c1t' ... etc.

No seu segundo exemplo, o resultado é exatamente o esperado. [abm] corresponde a qualquer um dos caracteres a, b ou m. Depois disso, o operador de período corresponde a qualquer caractere. Portanto, a expressão está procurando apenas sequências de quatro letras.

Descobri que o melhor recurso para aprender expressões regulares é Mastering Regular Expressions da O'Reilly Media. Abrange não apenas um grande número de dialetos regulares, mas também fornece muitas informações sobre como os motores realmente fazem o processamento. Um recurso inestimável se você estiver usando expressões regulares regularmente (trocadilho intencional).

    
por 09.08.2009 / 18:20
0

Se você não tiver tempo para um livro inteiro sobre o assunto, pode ser útil experimentar o expresso (sintaxe .net) ou a ferramenta comercial RegexBuddy que faz as sintaxes perl, ruby, java, .net e grep (entre outras). Ambas as ferramentas permitem que você teste o que vai e o que não combina, e mostrará a você uma árvore do que a expressão regular significa.

Para sua pergunta, seu comportamento esperado viria de c[abm]t not c[abm].t , mas isso já foi apontado.

    
por 11.08.2009 / 01:34

Tags