Ich versuche in einem awk
Skript, '(' als Feldtrennzeichen zu verwenden. Es sei denn, ich verbinde die Klammer mit einem doppelten Backslash, wie folgt:
BEGIN {FS=" \\("}
es funktioniert nicht.
Wenn ich benutze, FS=" \("
bekomme ich
awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/
Ausgabe und wenn ich die Klammer überhaupt nicht verlasse, bekomme ich nur die
awk: prog:2: fatal: :, [., or [=: / (/
Nachricht.
Können Sie dieses Verhalten bitte erklären?
Antwort1
␣(
Um (Leerzeichen+Klammern) als Feldtrennzeichen in zu verwenden awk
, verwenden Sie "␣\\\("
:
$ echo "a (b (c" | awk -F " \\\(" '{ print $1; print $2; print $3 }'
a
b
c
Alternativ können Sie einfache Anführungszeichen und zwei Backslashes verwenden:
$ echo "a (b (c" | awk -F ' \\(' '{ print $1; print $2; print $3 }'
a
b
c
Der Grund hierfür ist, dass ␣(
(eine einzelne Klammermitein führendes Leerzeichen) ist ein fehlerhafter regulärer Ausdruck. Die linke Klammer öffnet eine Gruppierung, die nie geschlossen wird. Aus diesem Grund muss sie maskiert werden.
Der Grund dafür (
(eine einzelne Klammerohneein führendes Leerzeichen) funktioniert, besteht darin, dass FS
es nicht als regulärer Ausdruck behandelt wird, wenn es sich um ein einzelnes Zeichen handelt.
Antwort2
Ich bin auf diesen Thread gestoßen, als ich nach einer Lösung für ein ähnliches Problem gesucht habe – die Verwendung von ␣
OR (
als Feldtrennzeichen für awk. Dies war zwar keine vollständige Antwort, aber hier ist meine Lösung:
Wenn Sie die Kombination ␣(
als einzelne Einheit zum Trennen von Dateien in AWK wünschen, gehen Sie wie folgt vor awk -F '( \\()' ...
:
$ echo "This (maybe) is a test()" | awk -F '( \\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe) is a test()
Number of Fields: 2
Wenn Sie nach einer Lösung für mein ähnliches Problem suchen, tun Sie entweder ␣
ODER :(
awk -F '( |\\()' ...
$ echo "This (maybe) is a test()" | awk -F '( |\\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe)
is
a
test
)
Number of Fields: 7