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?

Overtomanu
quelle
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
RomanPerekhrest
quelle
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