Eu tenho este arquivo:
10 replies
Big Horse
123sdf562
replies
1354654
Fat Cat
2 replies
White Horse
Big Cat
Little Dog
5 replies
725vgfvjgh123
Black Horse
Brown Cow
8798jgjh
Quero extrair linhas que contenham a palavra cavalo, a palavra responde precedida por um número e letras entre números. Então, minha saída desejada deve ser:
10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse
Este código grep '[0-9] replies\|[0-9][a-z]\|Horse' file
retorna
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse
8798jgjh
mas 8798jgjh
não deve estar na saída porque jgjh
não está entre números.
grep '[0-9] replies\|[0-9][a-z][0-9]\|Horse' file
não funciona. Então, como pode obter a saída certa?
Você poderia usar isso
grep
. A ideia com\{1,\}
quantificador (em BRE) usado em vários lugares é combinar pelo menos um caractere do grupo usado junto. Uma versão portátil seria fazerNas
grep
versões que suportam ERE, por exemplo, GNU grep, os caracteres de escape adicionais nas expressões não são necessáriosVocê pode substituir os grupos de classes de caracteres
[0-9]
,[a-z]
por grupos independentes de localidade como[[:digit:]]
e[[:lower:]]
também.Expressão regular - revisão
Você pode usar isso com GNU
grep
:O problema com seu comando é que você não está quantificando o
[a-z]
, então ele procura apenas um caractere.Usando standard
grep
, você forneceria ao utilitário as expressões separadas com as quais desejaria corresponder as linhas.O
\{n,m\}
força a expressão anterior a corresponder pelo menosn
vezes e na maioria dasm
vezes. Isso significa\{1,\}
que a expressão anterior corresponde pelo menos uma vez, assim como+
faria em uma expressão regular estendida POSIX.Usando Raku (anteriormente conhecido como Perl_6)
Entrada de amostra:
Saída de amostra:
Aqui está uma solução usando Raku, um membro da família Perl de linguagens de programação. O esforço do Raku (também conhecido como Perl6) começou no ano 2000 e inclui uma grande revisão do PCRE (Expressões Regulares), que algumas pessoas acham mais legível.
O código acima usa o
grep
comando do Raku, que pode receber váriosm/…/
matchers Regex, neste caso conectados por um|
booleano OR. Observe que o primeiro matcher permitirá a correspondência que não diferencia maiúsculas de minúsculashorse
porque usa o:i
"advérbio" que não diferencia maiúsculas de minúsculas. Se você quiser apenasHorse
corresponder, altere de acordo (e exclua o:i
advérbio).É claro que vale a pena ser cauteloso ao escrever Regexes, e você deve observar que não apenas
m/ Horse /
corresponderá aBig Horse
,Black Horse
, eWhite Horse
, masHorse-faced
também. Você só pode querer linhas contendoHorse
quando precedidas por outra palavra com espaço em branco intermediário, caso em quem/ <alpha>+ <ws> Horse /
pode se encaixar na conta.https://docs.raku.org/language/regexes
https://raku.org