Expressão regular encontra 3 ou 4 números

1

Então, eu tenho mais de 50 palavras e tenho que combinar os números nelas. Esses números podem ser de 3 ou 4 dígitos. Acho que tentei de todas as maneiras, mas nada parece funcionar (preciso lembrar o número como um padrão). Minhas tentativas:

'/\(.*\)\([0-9][0-9]?[0-9][0-9]\)\(.*\)/'
'/\(.*\)\([0-9]\{3,4\}\)\(.*\)/'
'/\(.*\)\(([0-9][0-9][0-9][0-9]|[0-9][0-9][0-9])\)\(.*\)/'
...

Sempre corresponde a apenas 3 números ou a palavra inteira.

ENTRADA:

1844-PAL.Bak 
IMG_1959.bak  
ZER_1940.BAK  
PEN225.bak
word-1943.BAK

NECESSITA DE RECORDAR COMO UM PADRÃO:

1844
1959
1940
225
1943
    
por Wanderer 19.05.2014 / 16:34

3 respostas

5

Existem várias maneiras de fazer isso. Os seguintes comandos assumem que cada linha de entrada só pode ter um número. Estou usando este arquivo como um teste:

1844-PAL.Bak 
IMG_1959.bak  
ZER_1940.BAK  
PEN225.bak
word-1943.BAK
  1. sed

    $ sed -r 's/([^0-9]*)([0-9]*)([^0-9]*)/1:"", 2:"", 3:""/' file
    1:"", 2:"1844", 3:"-PAL.Bak "
    1:"IMG_", 2:"1959", 3:"bak  "
    1:"ZER_", 2:"1940", 3:"BAK  "
    1:"PEN", 2:"225", 3:"bak"
    1:"word-", 2:"1943", 3:"BAK"
    
  2. perl

    $ perl -lpe 's/([^\d]*)(\d*)([^\d])/1:"$1", 2:"$2", 3:"$3"/' file
    1:"", 2:"1844", 3:"-"PAL.Bak 
    1:"IMG_", 2:"1959", 3:"."bak  
    1:"ZER_", 2:"1940", 3:"."BAK  
    1:"PEN", 2:"225", 3:"."bak
    1:"word-", 2:"1943", 3:"."BAK
    
  3. grep

    $ grep -oP '\d+' file
    1844
    1959
    1940
    225
    1943
    

Se você tiver apenas um padrão de interesse por linha, poderá simplificar para

 $ sed -r 's/[^0-9]*([0-9]*).*/Matched: /' file
Matched: 1844
Matched: 1959
Matched: 1940
Matched: 225
Matched: 1943

ou

$ perl -lpe 's/.*?(\d+).*/Matched $1/' file
Matched 1844
Matched 1959
Matched 1940
Matched 225
Matched 1943

Em geral, com expressões regulares, menos é mais. Você deve sempre tentar usar a expressão regular mais simples necessária. Se você não quiser capturar ou combinar os caracteres que não são números, deixe-os fora da expressão regular.

    
por 19.05.2014 / 16:45
1

Experimente o comando abaixo GNU grep ,

grep -oP '[0-9]{3,4}' file
    
por 19.05.2014 / 16:46
1
sed -e "s/^[^0-9]*//g" -e "s/\(^[0-9]*\)\(.*\)//" <file_name>

uma outra maneira de fazer isso

sed 's/[^0-9]*//g' <file_name>
    
por 03.04.2017 / 09:19