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?
awk
zulässt. BSDawk
wirft einen Fehler,awk: illegal primary in regular expression || at |
ebenso wiemawk
,mawk: line 0: regular expression compile failed (missing operand)
.(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)Antworten:
Das vertikale
|
Zeichen wird in Ihrem Fall als Sonderzeichen behandelt und sollte maskiert werden:Alternativ können Sie
|
in die Charakterklasse einfügen:quelle
-F'\\||'
Sie damit leer werden{print $2}
(zweites Feld)|
IST "senkrechter Strich" char (nicht oder Zeichen), semantisch - in einem gewissen Kontext ist es logischOR
in einer anderen Kontext - Operator, - regex Wechsel Operator|
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.)