Expressão regular para encontrar caracteres duplos no Bash

8

Estou procurando uma expressão regular que encontre todas as ocorrências de caracteres duplos em um texto, uma listagem etc. na linha de comando (Bash).

Pergunta principal : Existe uma maneira simples de procurar sequências como aa , ll , ttttt , etc. onde se define uma expressão regular que procura n ocorrências do mesmo personagem com? O que estou procurando é conseguir isso em um nível muito básico. Na linha de comando. Em um shell do Linux.

Depois de bastante pesquisa, cheguei às seguintes respostas - e questões resultantes deles, assim eles apenas me deram uma dica de onde a solução poderia estar. Mas:

a) (e) grep e a questão da barra invertida

  • grep 'a\{2\}' procura aa
  • egrep'a{2}' procura aa

Pergunta: A necessidade de configurar backlashes realmente está vinculada ao comando que eu uso? Em caso afirmativo, alguém pode me dar uma dica sobre o que mais deve ser levado em conta ao usar (e) grep aqui?

b) Eu encontrei esta resposta aqui para minha pergunta, embora não seja exatamente o que eu estava procurando para:

grep -E '(.)' filename procura entradas com o mesmo caractere aparecendo mais de uma vez, mas não pergunta com que frequência . Isso está perto do que estou procurando, mas ainda quero definir várias repetições.

Eu provavelmente deveria dividir isso em duas ou mais perguntas, mas não quero inundar esse site incrível aqui.

P.S .: Outra questão, possivelmente fora do tópico, mas: é in , inside , at ou on the shell . E é on the command line correto?

    
por erch 02.04.2013 / 22:12

3 respostas

8

Isso realmente é duas questões e deveria ter sido dividido. Mas como as respostas são relativamente simples, vou colocá-las aqui. Essas respostas são para o GNU grep especificamente.

a) egrep é o mesmo que grep -E . Ambos indicam que "Expressões regulares estendidas" devem ser usadas em vez das Expressões regulares padrão de grep . grep requer as barras invertidas para Expressões regulares simples.

Da página man :

Basic vs Extended Regular Expressions

In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

Veja a página man para obter detalhes adicionais sobre convenções históricas e portabilidade.

b) Use egrep '(.){N}' e substitua N pelo número de caracteres que você deseja substituir menos um (desde que o ponto corresponda ao primeiro). Portanto, se você quiser corresponder um caractere repetido quatro vezes, use egrep '(.){3}' .

    
por 02.04.2013 / 23:00
5

Isso procuraria 2 ou mais ocorrências do mesmo caractere:

grep -E '(.)+' file

Se o seu awk tiver a opção -o, isso imprimiria cada correspondência em uma nova linha.

grep -Eo '(.)+' file

Para encontrar correspondências com exatamente 3 correspondências:

grep -E '(.){2}' file

Ou 3 ou mais:

grep -E '(.){2,}' file

etc.

editar

Na verdade, @stephane_chazelas está certo sobre as referências de volta e -E. Eu tinha esquecido disso. Eu tentei no BSD grep e no GNU grep e ele funciona lá, mas não em outros greps. Você precisaria usar uma das versões abaixo ...

Versões regulares do grep:

grep '\(.\)\{1,\}' file

grep -o '\(.\)\{1,\}' file

grep '\(.\)\{2\}' file

grep '\(.\)\{2,\}' file

A opção -o também não é grep padrão BTW (provavelmente se o seu grep entender que -o também pode fazer a referência de volta).

Nota : grep -E '(.){2,}' file e grep '\(.\)\{2\}' file estão errados, como alexis indicou e deve ser ignorado ..

    
por 02.04.2013 / 22:56
2

Primeiramente, obrigado a todos por seus comentários e sugestões de apoio. Acontece que eu já estava bem perto da resposta.

O Problema principal foi sobre:

Is there a simple way to look for n occurences of the same character, e.g. aa, tttttt

Resposta curta :

Os seguintes comandos [variações de] repetem a pelo menos um e infinitas vezes

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

ou, com as Expressões Regulares do GNU disponíveis grep a\+


O número de repetições é definido dentro das chaves, através do padrão {min,max}{n} repetir exatamente n vezes, {n,} repetir pelo menos n vezes e {n,m} repetir pelo menos n mas no máximo m vezes.

Assim, como consequência, levantou o problema secundário :

Is the necessity of setting backlashes bound to the command I use?

Resposta curta : Sim, o uso de barras invertidas depende se alguém usa grep ou egrep

  • grep : a barra invertida ativa metacaracteres [usa expressões regulares básicas]
  • egrep barra invertida de - ativa metacaracteres [usa expressões regulares estendidas]

Como essa é a resposta curta, quero fornecer aos que tiveram problemas semelhantes, acrescentei meu resumo básico do que um deles deve estar ciente, trabalhando com grep e egrep .



Expressões básicas, estendidas e GNU regulares

Expressões regulares básicas

Usado no comando grep , ed e sed

As funcionalidades básicas das Expressões Regulares Básicas são:

  • A maioria dos metacaracteres, por ex. ? [ . \ ) etc. são ativados através de uma barra invertida. Se não houver barras invertidas, elas serão consideradas como (parte do) termo de pesquisa.
  • ^ $ \< e \> são suportados sem uma barra invertida
  • Nenhum caractere abreviado [ \b , \s , etc.]

GNU Expressões regulares básicas são adicionadas a estas

  • \? repete o caractere zero ou uma vez ( c\? corresponde a c e cc ) e é uma alternativa para \{0,1\}
  • \+ repete um caractere pelo menos uma vez ( c\+ corresponde a cc , cccccccc etc.) e é uma alternativa para \{1,\}

  • \| é suportado (por exemplo, grep a\|b procurará a ou b

grep -E permite que o comando use todo o conjunto das Expressões regulares estendidas:


Expressões regulares estendidas [ERE]

Usado em egrep , awk e emacs é o Basic Set além de alguns recursos.

  • Metacaracteres são desativados por meio de uma barra invertida
  • Sem referências anteriores
  • else: muitas das expressões regulares mágicas geralmente podem fazer por uma

GNU Expressões regulares de extensão

adiciona os seguintes recursos

Os dois links direcionarão um para o regular-expressions.info, que, além do apoio que recebi aqui, realmente me ajudou muito.

    
por 07.04.2013 / 01:44