Ricerca senza distinzione tra maiuscole e minuscole in awk


20

Devo cercare una parola chiave usando awk, ma voglio eseguire una ricerca senza distinzione tra maiuscole e minuscole (senza distinzione tra maiuscole e minuscole).

Penso che l'approccio migliore sia capitalizzare sia il termine di ricerca ("parola chiave") sia la linea target che awk sta leggendo allo stesso tempo. Da questa domanda io uso touppercome stampare in maiuscolo, ma non so come usarlo in una corrispondenza perché quella risposta mostra solo la stampa e non lascia il testo in maiuscolo in una variabile.

Ecco un esempio, dato questo input:

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

Vorrei questo risultato:

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

Questo è quello che ho, ma non so come aggiungere toupper:

awk "BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }" text.txt

Risposte:


23

Sostituisci la tua espressione in modo che corrisponda a un modello (ovvero /&&&key word&&&/) con un'altra espressione che utilizza esplicitamente $0la riga corrente:

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

o

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

così hai

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

Sono necessarie virgolette singole perché $0, il blocco BEGIN può essere rimosso poiché le variabili vengono inizializzate per impostazione predefinita al primo utilizzo ""o 0al primo utilizzo ed {print}è l'azione predefinita, come indicato nei commenti seguenti.


4
Nota che potresti semplificarlo awk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! p ; next } ; p;' text.txt. Non è necessario il BEGINblocco e poiché l'azione predefinita è la stampa, p;è sufficiente.
terdon

1
"Non è necessario il BEGINblocco" poiché una variabile non inizializzata viene valutata come falsa.
Glenn Jackman,

Grazie per le ottimizzazioni. Di solito cerco di limitare la mia risposta a modifiche minime all'originale, ma è vero che il nuovo risultato è molto più stretto e abbastanza leggibile.
Meuh

2
Solo una nota: tolowerè presente su sistemi awk antichi (o non così antichi) (es: AIX), ma touppernon è sempre disponibile ^^.
Olivier Dulac

16

gawk ha una IGNORECASEvariabile incorporata che, se impostata su un valore diverso da zero, fa sì che tutti i confronti di stringhe ed espressioni regolari non facciano distinzione tra maiuscole e minuscole. Puoi usare quello:

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

ecc. Questo è specifico gawk, però, ma trovo che sia più leggibile dell'alternativa (più portatile) di meuh. Se questo è un problema, dipende ovviamente da te.


1
Ho voluto supportare awk per anni in uno dei miei più grandi progetti gawk, ma la mancanza di ricerca insensibile al maiuscolo fa scattare che gawk lo ha reso un non avviatore a causa del numero di ricerche insensibili al maiuscolo e minuscolo. gensub è l'altra caratteristica gawk che era troppo difficile da sostituire in awk. Ma gawk non è sempre installato di default su alcune macchine e distribuzioni, anche se è quasi sempre disponibile, ma è un peccato che entro il 2016 non possano cambiare awk e posix per espandere un po 'le funzionalità di tali strumenti standard.
Lizardx,

3
@Lizardx: questo è il punto centrale di non espandersi: mantienilo standard. Altrimenti crei solo un altro standard e poi hai delle incomprensioni tra loro (lo fanno, ma provano a mantenere le modifiche standard al minimo ... anche allora, lo standard multiplo è una delle piaghe principali dell'informatica)
Olivier Dulac

2
Non sono d'accordo Con un'esecuzione accurata, puoi introdurre espansioni supportando tutti i metodi legacy, cosa succede se non riesci a farlo è che le cose iniziano a svanire nell'irrilevanza nel tempo. Tutto nell'informatica si evolve, il trucco è mantenere un'evoluzione affidabile molto stabile. Bash è un buon esempio di ciò, super affidabile e semplicemente aggiunge nuove funzionalità, non è tanto "due standard" quanto, utilizza ciò che è supportato e una volta che le modifiche sono state implementate a livello globale, puoi iniziare a utilizzare le nuove funzionalità perché solo il i sistemi legacy più vecchi non avranno supporto.
Lizardx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.