Groß- / Kleinschreibung wird in awk nicht berücksichtigt

20

Ich muss mit awk nach einem Schlüsselwort suchen, aber ich möchte eine Suche ohne Berücksichtigung der Groß- / Kleinschreibung (ohne Berücksichtigung der Groß- / Kleinschreibung) durchführen.

Ich denke, der beste Ansatz ist, sowohl den Suchbegriff ("Schlüsselwort") als auch die Zielzeile, die awk gleichzeitig liest, in Großbuchstaben zu setzen. Aus dieser Frage, wie ich es verwende toupper, um in Großbuchstaben zu drucken, aber ich weiß nicht, wie ich es in einer Übereinstimmung verwende, weil diese Antwort nur das Drucken zeigt und den Großbuchstaben-Text nicht in einer Variablen belässt.

Hier ist ein Beispiel für diese Eingabe:

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

Ich möchte diese Ausgabe:

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

Dies ist, was ich habe, aber ich weiß nicht, wie ich hinzufügen soll toupper:

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

Antworten:

23

Ersetzen Sie Ihren Ausdruck so, dass er mit einem Muster (dh /&&&key word&&&/) durch einen anderen Ausdruck übereinstimmt, und verwenden Sie dabei explizit $0die aktuelle Zeile:

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

oder

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

Also hast du

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

Sie benötigen einfache Anführungszeichen, da $0der BEGIN-Block entfernt werden kann, da Variablen standardmäßig bei ""oder 0bei der ersten Verwendung initialisiert werden. Dies {print}ist die Standardaktion, wie in den Kommentaren unten erwähnt.

meuh
quelle
4
Beachten Sie, dass Sie das vereinfachen können awk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! p ; next } ; p;' text.txt. Der BEGINBlock ist nicht erforderlich und reicht aus, da standardmäßig gedruckt p;wird.
Terdon
1
"Der BEGINBlock ist nicht erforderlich ", da eine nicht initialisierte Variable als falsch ausgewertet wird.
Glenn Jackman
Danke für die Optimierungen. Normalerweise versuche ich, meine Antwort auf minimale Änderungen am Original zu beschränken, aber es ist wahr, dass das neue Ergebnis viel präziser und gut lesbar ist.
Meuh
2
Nur eine Anmerkung: tolowerist auf alten (oder nicht so alten) awk-Versionen (zB AIX) vorhanden, aber touppernicht immer verfügbar ^^.
Olivier Dulac
16

gawk hat eine IGNORECASEeingebaute Variable, die, wenn sie auf einen Wert ungleich Null gesetzt ist, bewirkt, dass bei allen Vergleichen von Zeichenfolgen und regulären Ausdrücken die Groß- und Kleinschreibung nicht beachtet wird. Sie könnten das verwenden:

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

etc. Das ist zwar spezifisch gawk, aber ich finde es lesbarer als die (portablere) Alternative von meuh. Ob das ein Problem ist, liegt natürlich ganz bei Ihnen.

Wouter Verhelst
quelle
1
Ich wollte awk seit Jahren in einem meiner größten Gawk-Projekte unterstützen, aber das Fehlen der Suche nach Groß- und Kleinschreibung hat dazu geführt, dass gawk aufgrund der Anzahl der Suchen nach Groß- und Kleinschreibung, die das Zeug ausführt, nicht mehr gestartet werden kann. gensub ist die andere Gawk-Funktion, die in awk zu schwer zu ersetzen war. Allerdings ist gawk auf einigen Rechnern und Distributionen nicht immer standardmäßig installiert, obwohl es fast immer verfügbar ist, aber es ist bedauerlich, dass sie awk und posix bis 2016 nicht ändern konnten, um die Funktionalität solcher Standardtools ein wenig zu erweitern.
Lizardx
3
@Lizardx: Das ist der springende Punkt, wenn Sie nicht expandieren: Behalten Sie den Standard bei. Andernfalls erstellen Sie einfach einen anderen Standard und haben einige Inkompatibilitäten zwischen ihnen (sie tun dies, aber versuchen, die Standardänderungen auf ein Minimum zu beschränken ... auch dann ist der Einsatz mehrerer Standards eine der Hauptprobleme beim Computing)
Olivier Dulac
2
Ich stimme nicht zu. Bei sorgfältiger Ausführung können Sie Erweiterungen einführen, während Sie alle älteren Methoden unterstützen. Wenn Sie dies nicht tun, wird das Zeug im Laufe der Zeit immer unwichtiger. Alles im Computing entwickelt sich, der Trick ist, eine sehr stabile und zuverlässige Entwicklung aufrechtzuerhalten. Bash ist ein gutes Beispiel dafür. Es ist sehr zuverlässig und fügt einfach neue Funktionen hinzu. Es sind nicht nur zwei Standards, sondern es wird auch unterstützt. Sobald die Änderungen global eingeführt wurden, können Sie die neuen Funktionen verwenden, da nur die Älteste Altsysteme werden nicht unterstützt.
Lizardx