Ich habe das im Gawk-Handbuch gelesen:
GNU-ERWEITERUNGEN
[…]
Die Möglichkeit, einzelne Zeichen aufzuteilen, indem der Null-String als
Wert von FS und als drittes Argument für split() verwendet wird.
Dies scheint jedoch nicht der Fall zu sein. Dies funktioniert wie erwartet:
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
und ich kann andere Erweiterungen deaktivieren:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined
aber ich kann das Split-Verhalten nicht deaktivieren:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6
Ich habe auch im Mawk-Handbuch nachgesehen:
Wenn FS =„“, dann zerlegt mawk den Datensatz in einzelne Zeichen und
genauso platziert split(s,A,““) die einzelnen Zeichen von s in A.
[…]
Posix lässt das Verhalten von FS =„“ explizit undefiniert und erwähnt
das Aufteilen des Datensatzes in Zeichen als mögliche Interpretation, aber
derzeit ist diese Verwendung nicht über Implementierungen hinweg portierbar.
Also, mit welchen Implementierungen können Sie einzelne Zeichen nicht mit FS
erhalten undsplit
?
Akzeptierte Antwort:
Das ist nicht POSIX, da Sie es nicht in POSIX-Skripten verwenden können, da POSIX das Verhalten unspezifiziert lässt . Das bedeutet, dass eine Anwendung (ein Skript) es nicht verwenden kann, wenn es portabel sein möchte, eine Implementierung (ein awk
Implementierung) kann tun, was es will, wenn Sie es tun und immer noch POSIX sein. POSIX erfordert kein awk
B. in Zeichen oder Bytes aufzuteilen oder einen Fehler zu melden oder den Computer neu zu starten, bleibt es unspezifiziert.
Also gawk
hat keinen Grund, sein Verhalten in dieser Hinsicht zu ändern, wenn $POSIXLY_CORRECT
in der Umgebung¹ liegt, gibt es in diesem Fall kein Verhalten, das POSIX-mäßig korrekter ist als das andere.
Wie Sie herausgefunden haben, ist diese Erweiterung in gawk (seit 3.0, Januar 1996) und mawk (seit Version 1.2, Januar 1996) zu finden. Es ist auch in busybox awk
(von Anfang an (2002)), und seit Mai 1996 auch in der von Brian Kernighan gepflegten (der k
in awk
) (die FIXES
Datei bezieht sich auf gawk
, usw. als Anregung). Es sieht so aus, als ob es innerhalb weniger Monate zu allen 3 hinzugefügt wurde, was darauf hindeutet, dass es möglicherweise unter ihren Betreuern diskutiert wurde. Ich bin mir jetzt nicht mehr sicher, wer zuerst auf die Idee gekommen ist.
Mit Brian Kernighans awk
oder die darauf basierenden wie FreeBSD oder OpenBSD, beachten Sie, dass während ein leerer FS
ist oder ein leeres drittes Argument, das an split()
übergeben wird bewirkt, dass der String in seine einzelnen Zeichen (also Bytes) zerlegt wird , siehe unten), awk -F ''
gibt einen Fehler zurück (awk -v FS=
ist aber OK).
Unter Solaris mit beiden nawk
und /usr/xpg4/bin/awk
(und auch die alte /bin/awk
aus den 70er Jahren), ein leerer FS
scheint das Aufteilen insgesamt zu deaktivieren. nawk -F ''
gibt einen Fehler zurück. Ich würde erwarten, dass es auf anderen kommerziellen Unices, die auf AT&T-Code wie AIX oder HP/UX basieren, genauso sein würde, obwohl ich es dort nicht testen kann.
Beachten Sie auch, dass mawk
, awk
von bwk (das ist bei einigen basierten anders on it) und busybox awk unterstützen keine Multibyte-Zeichen. Also zum Beispiel in UTF-8:
echo Stéphane | awk -v FS= '{print $4}'
würde die zweite Hälfte des dritten Buchstabens in meinem Vornamen drucken. Bei diesen ist es also richtiger zu sagen, dass ein leerer FS in einzelne Bytes aufgeteilt wird, nicht in Zeichen.
¹ Ich verstehe das jetzt mit POSIXLY_CORRECT, oder --posix
, gawk
deaktiviert einige Erweiterungen, die ansonsten nicht mit POSIX in Konflikt geraten (typeof
macht gawk
nicht konform), also könnte man sagen, es ist eine Auslassung. Nun wäre es nicht das erste. Beispielsweise wird nextfile
nicht deaktiviert obwohl es mit POSIX in Konflikt steht (awk '{nextfile = 1}'
soll der nextfile
eine 1 zuweisen Variable, meldet aber einen Fehler in gawk
sogar unter POSIXLY_CORRECT).