Encontre um padrão sem números repetidos no egrep

3

Eu para encontrar uma expressão regular para corresponder a todas as sequências de dígitos que não tenham dígito repetido. Exemplo:

198345 - > correspondido.

198315 - > não correspondido (1 repetido duas vezes)

Como posso conseguir isso em grep\egrep ?

    
por David Martínez 03.06.2014 / 21:29

4 respostas

3

Se você precisar fazer isso com o regex, veja a a maravilhosa resposta de Stephane a uma pergunta semelhante .

Se o regex não é obrigatório, ofereço uma alternativa em Perl:

perl -nle '
    $digits{$_}++ for /([0-9])/g;
    @repeated = grep { $digits{$_} > 1 } keys %digits;
    print @repeated? "":"$_"
    %digits = ();
' your_file

Isso pressupõe que your_file tenha um número por linha e imprima apenas os números cujos dígitos são únicos.

    
por 03.06.2014 / 21:43
4

Pergunta interessante. Obrigado. A resposta eu achei um pouco assustador:

egrep -v '([0-9])[0-9]*'
O padrão

localiza a ocorrência do dígito [0-9] , salve-o em e verifique se não há repetição. Por isso, encontra qualquer dígito seguido pelo mesmo dígito. Use -v para inverso

    
por 03.06.2014 / 22:36
0

Editar:

Abaixo, os mesmos números devem aparecer consecutivamente: eles correspondem a 1123456 (1s consecutivos), mas não a 1213456 (1s não consecutivos):

Uma solução fraca é esta:

cat testfile |  grep [0-9] | grep -v "0\{2,\}" | grep -v "1\{2,\}" | grep -v "2\{2,\}"  | grep -v "3\{2,\}"  | grep -v "4\{2,\}"  | grep -v "5\{2,\}"  | grep -v "6\{2,\}"  | grep -v "7\{2,\}"  | grep -v "8\{2,\}"  | grep -v "9\{2,\}"  

O primeiro grep corresponde a números e o restante a 10 grep garante que cada número apareça apenas uma vez.

Uma maneira mais compacta, mas ainda assim, é esta:

cat test |  grep [0-9] | grep -v "1\{2,\}\|2\{2,\}\|3\{2,\}\|4\{2,\}\|5\{2,\}\|6\{2,\}\|7\{2,\}\|8\{2,\}\|9\{2,\}\|0\{2,\}"

testfile deve ter uma palavra por linha.

    
por 03.06.2014 / 22:05
0
grep '\([[:digit:]]\) * *'

Leva um dígito [[:digit:]] e lembra \( ... \) . Do que tentar igualar qualquer número de espaços * (incluindo nenhum), lembre-se do caractere , qualquer número de espaços, o caractere lembrado. Você pode tentar executá-lo com --color=auto para ver quais partes da entrada corresponde.

    
por 08.11.2016 / 07:08