Procura não sensível a maiúsculas e minúsculas no awk

14

Eu preciso procurar uma palavra-chave usando o awk, mas quero realizar uma pesquisa que não diferencia maiúsculas de minúsculas (não diferencia maiúsculas de minúsculas).

Acho que a melhor abordagem é capitalizar tanto o termo de pesquisa ("palavra-chave") quanto a linha de destino que o awk está lendo ao mesmo tempo. De esta pergunta Eu como usar toupper para imprimir em maiúsculas, mas não sei como usá-lo em uma partida porque essa resposta apenas mostra a impressão e não deixa o texto em maiúsculas em uma variável.

Aqui está um exemplo, dada esta entrada:

blablabla    
&&&Key Word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&KEY WORD&&&
blablabla

Eu gostaria dessa saída:

I want all 
these text and numbers 123
and chars !"£$%&
as output

Isso é o que eu tenho, mas não sei como adicionar toupper :

awk "BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }" text.txt
    
por Woeitg 01.04.2016 / 14:17

2 respostas

19

Substitua sua expressão para corresponder a um padrão (por exemplo, /&&&key word&&&/ ) por outra expressão usando explicitamente $0 , a linha atual:

tolower($0) ~ /&&&key word&&&/

ou

toupper($0) ~ /&&&KEY WORD&&&/

então você tem

awk 'tolower($0) ~ /&&&key word&&&/ { p = ! p ; next }; p' text.txt

Você precisa de aspas simples por causa do $0 , o bloco BEGIN pode ser removido, pois as variáveis são inicializadas por padrão como "" ou 0 no primeiro uso, e {print} é a ação padrão, conforme mencionado em os comentários abaixo.

    
por 01.04.2016 / 14:27
13

O gawk tem uma variável IGNORECASE builtin, que, se definida como diferente de zero, faz com que todas as comparações de expressões regulares e de expressões não sejam sensíveis a maiúsculas e minúsculas. Você poderia usar isso:

BEGIN{IGNORECASE=1}
/&&&key word&&&/ { foo bar baz }

Isso é específico para gawk , mas acho que é mais legível do que a alternativa (mais portátil) do meuh. Se isso é um problema, é claro, totalmente com você.

    
por 01.04.2016 / 14:48