Regex alternativo para {}

2

Estou tentando substituir toda essa linha, mas os números:

looktype="123"

para que apenas os números apareçam.

Isso é possível de alguma maneira fácil?

{sub ("look type=\"[0-9]{0,3}", "TEST")}

Estou tentando isso com awk , sem sucesso. Eu acredito que "sub" e {0, 3} estão interferindo.

    
por Marcus 19.09.2013 / 07:48

4 respostas

1

Você poderia canalizá-lo por meio de sed para extrair apenas o que está dentro dos caracteres de citação.

por exemplo,

$ echo 'looktype="123"' | sed -r -e 's/^.*"([^"]+)".*//'
123

Note que -r é específico do GNU sed e diz ao sed para usar regexps estendidas ao invés de básicas. Outras versões de sed não o têm, ou podem usar -E . Caso contrário, escreva na expressão regular básica POSIX (BRE) como:

sed -e 's/^.*"\([^"][^"]*\)".*//'
    
por 19.09.2013 / 07:58
3

Em expressões regulares estendidas (ERE), X{m,n} significa X repetido entre m e n vezes. O awk implementa expressões regulares estendidas, no entanto implementações históricas do awk não têm essa sintaxe de chave para intervalos repetidos. O padrão POSIX especifica que o awk deve suportar o ERE, mas muitas implementações existentes não são compatíveis.

Com o GNU awk, intervalos são suportados apenas desde a versão 4.0. Com versões mais antigas, você pode forçar o gawk a ser compatível com POSIX, configurando a variável de ambiente POSIXLY_CORRECT para um valor não vazio:

POSIXLY_CORRECT=1 awk '{sub ("looktype=\"[0-9]{0,3}", "TEST"); print}'

A versão padrão do awk em algumas distribuições não é gawk mas sim falsa, que é menor e mais rápida. Mawk não suporta expressões de chave. Há um patch para isso , mas como o mawk não está sendo mantido, não é amplamente adotado.

Quando a contagem de repetições é pequena, você pode soletrar:

awk '{sub ("looktype=\"[0-9]?[0-9]?[0-9]?[0-9]?", "TEST"); print}'
    
por 20.09.2013 / 01:02
0

Em awk (assumindo a entrada exata que você postou), você também pode fazer isso:

awk -F'=' '{print $2}' | sed 's/"//g'
    
por 19.09.2013 / 18:23
0

Uma alternativa no GNU grep (que eu suponho que você tenha por causa da tag do Ubuntu):

grep -o '[0-9]\+' your_file

Uma alternativa ainda mais portátil com o Perl

perl -nle '/([0-9]+)/ and print $1' your_file

As duas alternativas não são exatamente as mesmas. Eles se comportam de maneira diferente se você tiver várias instâncias de uma sequência de dígitos na mesma linha. A instrução grep imprimirá cada ocorrência de dígitos em uma linha separada, enquanto a instrução perl somente imprimirá a ocorrência mais à esquerda de uma sequência de dígitos em cada linha. Isso se deve à diferença na implementação interna do mecanismo de expressões regulares entre grep e Perl.

    
por 19.09.2013 / 19:53