awk verwendet nicht '||' als Feldtrennzeichen


7

Ich versuche, awk zu verwenden, um mit einem Trennzeichen für mehrere Zeichen zu schneiden

echo 'f1##f2' |awk -F '##' '{print $2}'

Es wird gedruckt f2. Wohingegen

echo 'f1||f2' |awk -F '||' '{print $1}'

druckt f1||f2.

Kann jemand erklären, was los ist?


Ich bin überrascht, dass GNU das überhaupt awkzulässt. BSD awkwirft einen Fehler, awk: illegal primary in regular expression || at |ebenso wie mawk, mawk: line 0: regular expression compile failed (missing operand).
— Kusalananda

@Kusalananda, das Verhalten ist von POSIX nicht spezifiziert. Das GNU-Verhalten ist nützlicher und macht IMO mehr Sinn. Es ist für mich sinnvoller, so zu sein (foo|bar|), (foo|bar)?als einen Fehler zurückzugeben. Das machen auch Perl-REs. ?in zsh globs ist das getan ( ?was in globs etwas anderes bedeutet)
— Stéphane Chazelas

Antworten:


11

Das vertikale |Zeichen wird in Ihrem Fall als Sonderzeichen behandelt und sollte maskiert werden:

echo "f1||f2" |awk -F'\\|\\|' '{print $1}'
f1

Alternativ können Sie |in die Charakterklasse einfügen:

echo "f1||f2||f3" |awk -F'[|]{2}' '{print $3}'
f3

Warum zweimal entkommen?
— Pfnuesel

1
@pfnuesel, weil -F'\\||'Sie damit leer werden {print $2}(zweites Feld)
— RomanPerekhrest

2
@ ctrl-alt-Delors, FYI: sprachlich | IST "senkrechter Strich" char (nicht oder Zeichen), semantisch - in einem gewissen Kontext ist es logisch ORin einer anderen Kontext - Operator, - regex Wechsel Operator
— RomanPerekhrest

1
@ ctrl-alt-delor Hinzufügen zum Kommentar von RomanPerekhrest: Das Aufrufen |eines ODER-Zeichens ist verwirrend, da es ein tatsächliches ODER-Zeichen gibt, das sich unterscheidet: "∨" ( Logisches Oder , U + 2228, im mathematischen Unicode-Block Operatoren ). (In einigen Schriftarten kann es fast wie der Buchstaben V in Großbuchstaben aussehen . Es sollte größer sein und einen größeren Winkel haben.)
— Volker Siegel

@VolkerSiegel Ich habe über seine Bedeutung in der Sprache gesprochen, nicht über den Charakternamen. In einem regulären Ausdruck heißt es anscheinend Alternation, obwohl ich es OR (nicht logisches OR) nenne.
— Strg-Alt-Delor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.