awk: "Standard" Aktion, wenn kein Muster gefunden wurde?

8

Ich habe ein awk-Skript, das nach vielen möglichen Mustern sucht und etwas für jedes Muster tut. Ich möchte, dass etwas getan wird, wenn keines der Muster übereinstimmt. also etwa so:

%Vor%

Natürlich ist die Zeile "DEFAULT" keine awk-Syntax und ich möchte wissen, ob es eine solche Syntax gibt (wie es normalerweise in swtich / case-Anweisungen in vielen Programmiersprachen der Fall ist).

Natürlich kann ich nach jeder Aktion immer einen "nächsten" Befehl hinzufügen, aber das ist mühsam, wenn ich viele Aktionen habe, und was noch wichtiger ist, es verhindert, dass ich die Zeile mit zwei oder mehr Mustern abgleiche.

>     
Gadi A 24.07.2013, 10:17
quelle

4 Antworten

11

Sie könnten die Übereinstimmung mit dem Negationsoperator ! so etwas wie:

invertieren %Vor%

Aber das ist ziemlich scheußlich für n>2 . Alternativ könnten Sie eine Flagge verwenden:

%Vor%     
Chris Seymour 24.07.2013, 10:23
quelle
7

GNU awk hat switch-Anweisungen:

%Vor%

Alternativ mit irgendeinem awk:

%Vor%

Verwenden Sie den "break" oder "next" wie / wann Sie wollen, genau wie in anderen Programmiersprachen.

Oder wenn Sie eine Flagge mögen:

%Vor%

Es ist nicht genau die gleiche Semantik wie eine echte "Standard" obwohl so eine Verwendung wie diese irreführend sein könnte. Ich würde normalerweise nicht befürworten, alle Großbuchstaben-Variablennamen zu verwenden, aber Kleinbuchstaben "Standard" würde mit dem Schlüsselwort gawk kollidieren, so dass das Skript nicht tragbar wäre, um in Zukunft zu gaffen.

    
Ed Morton 24.07.2013 14:16
quelle
1

Es gibt keine "wartungsfreie" Lösung für eine DEFAULT-Verzweigung in awk.

Die erste Möglichkeit, die ich vorschlagen würde, besteht darin, jeden Zweig einer Musterübereinstimmung mit einer "nächsten" Anweisung abzuschließen. Es ist also wie ein Break-Statement. Fügen Sie am Ende eine letzte Aktion hinzu, die mit allem übereinstimmt. Es ist also die DEAFULT-Filiale.

Die andere Möglichkeit wäre: Setzen Sie eine Markierung für jeden Zweig, der eine Musterübereinstimmung hat (d. h. Ihre Nicht-Standardzweige) z.B. Starten Sie Ihre Aktionen mit NONDEFAULT = 1;

Fügen Sie eine letzte Aktion am Ende hinzu (die Standardverzweigung) und definieren Sie eine Bedingung NONDEFAULT == 0, die in einem reg-Ausdrucksmatch enthalten ist.

    
tue 24.07.2013 10:38
quelle
0

Eine ziemlich saubere, portable Problemumgehung verwendet eine if -Anweisung:

Anstelle von:

%Vor%

könnte man folgendes verwenden:

%Vor%

Wie oben erwähnt, hat GNU awk switch-Anweisungen, aber andere awk -Implementierungen nicht, daher wäre die Verwendung von switch nicht portabel.

    
Jason Bacon 13.06.2014 13:29
quelle

Tags und Links