Como usar o regex apropriado para encontrar um padrão no awk?

1

Usando o exemplo a seguir, estou tentando descobrir o regex que cobre o seguinte padrão no meu awk program .

  • A saída pode ser apenas números com no máximo 5 comprimentos: i.g. 15251
  • A saída pode ter apenas duas letras "H" & "O" e qualquer número antes de =< 3 e depois de =< 5 e "O" pode ser opcional: i.g HO722 ou 799H89090
  • A saída poderia NÃO incluir qualquer coisa que tenha espaço ou palavras exceto dígitos: i.g hkks kjsla aaa - > não aceitável

    cat filename

    00ISM00123
    189902
    078HP890201
    HO90902
    123H7292
    234HO7027
    12345556
    GV18029039
    kslal HOsjlk jj 123
    687iOu7900
    

Eu tentei o seguinte script

 awk  '$1~/^[0-9]{,3}([hH][oO]?)[^a-zA-Z]/' filename'

mas não cobrem os dígitos do nome de arquivo , por exemplo,

>     189902 
>     12345556

quando eu tentei o seguinte script ainda a saída não está correta como esperado!

awk  '$1~/^([0-9]{,3}([hH][oO]?)?)[^a-zA-Z]/' filename

qualquer ajuda com a explicação é muito apreciada!

    
por Daniel 05.12.2016 / 16:27

2 respostas

1

Eu divido isso em duas regexes, parece que está funcionando:

cat filename | grep -E '^[0-9]{5}$|^[0-9]{0,3}[hH]{1}[oO]{0,1}[0-9]{0,5}$'

A primeira parte da regex tentará os nomes dos arquivos com apenas 5 dígitos, e a segunda parte está tentando nomes de arquivos com 0-3 dígitos, 1 'h' ou 'H' carta, 0 ou 1 'oO' letra, 0 a 5 dígitos.

Este regex funciona com awk também:

cat filename | awk  '/^[0-9]{5}$|^[0-9]{0,3}[hH]{1}[oO]{0,1}[0-9]{0,5}$/ {print}'
    
por 05.12.2016 / 17:10
1

Se você não está completamente ligado ao awk, grep funciona bem aqui:

$ grep -E '\<[[:digit:]]{1,3}HO?[[:digit:]]{1,5}\>' filename
123H7292
234HO7027

Essa é a saída que você está procurando? Gostaria de saber se HO90902 deve corresponder.

Os \< e \> são limites de palavras, portanto, "12345678H123" não corresponderá.

    
por 05.12.2016 / 21:15