Grep para possíveis resultados

2

Estou tentando encontrar possíveis correspondências,

ex****e

Então, qualquer coisa com ex no começo e no final com 4 personagens no meio, como eu poderia fazer isso?

    
por uni 20.03.2018 / 12:42

3 respostas

11

O operador de expressão regular que corresponde a um único caractere é . . Isso é semelhante a ? em curingas de shell. * corresponde a qualquer número da coisa anterior em expressões regulares (por exemplo, a* corresponde a qualquer número (incluindo 0) de a s) e a qualquer número de caracteres em curingas de shell.

POSIXly, para encontrar linhas que correspondam e x efetivamente a isso:

grep -xE 'ex.{4}e'

Ou:

grep -x ex....e

Ou:

grep -x 'ex.\{4\}e'

O segundo dos quais é o mais portátil. grep '^ex....e$' iria até funcionar na implementação original no Unix Versão 4 (1973); no entanto -x foi adicionado no Unix Versão 7 (1979) e é universal hoje em dia, então você pode confiar nele.

Expressões regulares estendidas também foram adicionadas em egrep em V7, mas inicialmente sem os operadores {x,y} interval. Esse operador foi adicionado como \{x,y\} para grep , mas muitas vezes não em egrep , pois isso quebraria a compatibilidade com versões anteriores. No início dos anos noventa, no entanto, o POSIX introduziu a opção -E de grep para mesclar a funcionalidade egrep em grep e requer que o suporte {x,y} e egrep agora seja descontinuado.

No entanto, você ainda encontra algumas implementações grep que não suportam -E ou egrep que não oferecem suporte a {x,y} , como /bin/grep e /bin/egrep do Solaris (onde você precisa para usar /usr/xpg4/bin/grep ).

Tenha em atenção que algumas implementações de grep não são multibyte aware e o seu operador . regexp pode corresponder em cada byte de um caractere multibyte como os caracteres UTF-8 não-ASCII).

$ $ locale charmap
UTF-8
$ echo extrême | busybox grep -x ex....e 
$ echo extrême | gnu-grep -x ex....e
extrême
$ echo extrême | busybox grep -x ex.....e
extrême

Como o caractere ê é feito de dois bytes em UTF-8, extrême tem 7 caracteres, mas 8 bytes:

$ printf %s extrême | wc -cm
      7       8
    
por 20.03.2018 / 12:52
2

Com o seguinte regex:

^ex.{4}e$

Ex:

$ grep -E '^ex.{4}e$' <<< 'ex****e'

ou

$ grep '^ex.\{4\}e$' <<< 'ex****e'

Saída:

    ex****e
    
por 20.03.2018 / 12:48
0

O padrão básico sugerido por @ stéphane-chazelas:

grep -xE 'ex.{4}e'  

encontrará qualquer linha consistindo de 'e', 'x', quaisquer 4 caracteres e 'e' e nenhum espaço em branco devido à troca '-x', equivalente à sugestão de @ gilles-quenot de

grep -E ^ex.{4}e$

No entanto, OP queria "qualquer coisa com ex no início e no final com 4 caracteres no meio", para incluir linhas com conteúdo não correspondente e conteúdo correspondente. Para conseguir isso, você precisaria do padrão,

    grep -E 'ex.{4}e'

Citações para impedir a expansão do suporte da casca.

    
por 20.03.2018 / 17:18

Tags