
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}
X
m
n
Padrã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_CORRECT
variá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 sed
para 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 sed
nã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 grep
instrução imprimirá cada ocorrência de dígitos em uma linha separada, enquanto a perl
instruçã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 grep
Perl e Perl.