Regex alternativa para {}

Regex alternativa para {}

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

looktype="123"

então apenas os números aparecem.

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

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

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

Responder1

Emexpressões regulares estendidas(ERE), significa repetido entre e vezes. O Awk implementa expressões regulares estendidas, porém as implementações históricas do awk não tinham essa sintaxe de chave para intervalos de repetição. OX{m,n}XmnPadrão POSIXespecifica que o awk deve suportar ERE, mas muitas implementações existentes não são compatíveis.

Com o GNU awk,intervalossão suportados apenas a partir da versão 4.0. Com versões mais antigas, você pode forçar o gawk a ser compatível com POSIX definindo a POSIXLY_CORRECTvariável de ambiente com 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 mawk, que é menor e mais rápida. Mawk não suporta expressões entre colchetes.Existe um patch para isso, mas como o mawk não está sendo mantido, ele 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}'

Responder2

Você pode canalizá-lo sedpara extrair apenas o que está dentro dos caracteres de aspas.

por exemplo

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

Observe que -ré específico do GNU sed, ele diz ao sed para usar regexps estendidos em vez de básicos. Outras versões de sednão o possuem ou podem usá-lo -E. Caso contrário, escreva em expressão regular básica POSIX (BRE) como:

sed -e 's/^.*"\([^"][^"]*\)".*/\1/'

Responder3

Em awk(assumindoexatoentrada que você postou), você também pode fazer isso:

awk -F'=' '{print $2}' | sed 's/"//g'

Responder4

Uma alternativa no GNU grep(que presumo que você tenha por conta da tag Ubuntu):

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

Uma alternativa ainda mais portátil com Perl

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

As duas alternativas não são exatamente iguais. Eles se comportam de maneira diferente se você tiver diversas instâncias de uma sequência de dígitos na mesma linha. A grepinstrução imprimirá cada ocorrência de dígitos em uma linha separada, enquanto a perlinstrução imprimirá apenas 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 grepPerl e Perl.

informação relacionada