Četl jsem to v příručce Gawk:
ROZŠÍŘENÍ GNU
[…]
Možnost rozdělit jednotlivé znaky pomocí řetězce null jako
hodnoty FS a jako třetího argumentu pro split().
Zdá se však, že tomu tak není. Funguje to podle očekávání:
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
a mohu zakázat další rozšíření:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined
ale nemohu vypnout chování rozdělení:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6
Díval jsem se také do manuálu Mawk:
Je-li FS =“”, pak mawk zlomí rekord na jednotlivé znaky a,
podobně split(s,A,””) umístí jednotlivé znaky s do A.[…]
Posix výslovně ponechává chování FS =„“ nedefinované a zmiňuje
rozdělení záznamu na znaky jako možnou interpretaci, ale
v současné době toto použití nelze přenášet mezi implementacemi.
Takže s jakými implementacemi nemůžete získat jednotlivé znaky pomocí FS
asplit
?
Přijatá odpověď:
To není POSIX v tom, že jej nemůžete použít ve skriptech POSIX, protože POSIX ponechává chování nespecifikováno . To znamená, že zatímco aplikace (skript) jej nemůže použít, pokud chce být přenosný, implementace (awk
implementace) může dělat, co chce, pokud to děláte a stále budete POSIX. POSIX nevyžaduje awk
rozdělit na znaky nebo bajty nebo nahlásit chybu nebo restartovat počítač, ponechá to nespecifikované.
Takže gawk
nemá žádný důvod měnit své chování v tomto ohledu, když $POSIXLY_CORRECT
je v prostředí¹, v tomto případě neexistuje žádné chování, které by bylo POSIXově správnější než to druhé.
Jak jste zjistili, toto rozšíření se nachází v gawk (od 3.0, leden 1996) a mawk (od verze 1.2, leden 1996). Je také v busybox awk
(od začátku (2002)) a od května 1996 také v té, kterou spravuje Brian Kernighan (k
v awk
) (FIXES
soubor odkazuje na gawk
, atd. jako inspiraci). Vypadá to, že to bylo přidáno do všech 3 během několika měsíců, což naznačuje, že to možná bylo diskutováno mezi jejich správci. Teď si nejsem tak jistý, kdo dostal nápad jako první.
S awk
Briana Kernighana nebo ty, které jsou na něm založené jako FreeBSD nebo OpenBSD, všimněte si, že zatímco prázdný FS
nebo prázdný třetí argument předaný do split()
způsobí, že se řetězec rozdělí na jednotlivé znaky (no, bajty , viz níže), awk -F ''
vrátí chybu (awk -v FS=
je v pořádku).
Na Solarisu s oběma nawk
a /usr/xpg4/bin/awk
(a také staré /bin/awk
ze 70. let), prázdný FS
Zdá se, že dělení úplně zakazuje. nawk -F ''
vrátí chybu. Očekával bych, že to bude stejné na jiných komerčních Unices založených na kódu AT&T, jako je AIX nebo HP/UX, i když to tam nemohu otestovat.
Všimněte si také, že mawk
, bwk awk
(to se liší pro některé založené na něm) a busybox awk nepodporují vícebajtové znaky. Například v UTF-8:
echo Stéphane | awk -v FS= '{print $4}'
vypíše druhou polovinu třetího znaku v mém křestním jménu. Takže s těmi je správnější říci, že prázdný FS se rozdělí na jednotlivé bajty, nikoli znaky.
¹ Nyní si uvědomuji, že s POSIXLY_CORRECT nebo --posix
, gawk
zakáže některá rozšíření, která jinak nejsou v konfliktu s POSIX (typeof
dělá gawk
nevyhovující), takže by se dalo říci, že jde o opomenutí. Teď by to nebylo první. Například nezakáže nextfile
i když je v konfliktu s POSIX (awk '{nextfile = 1}'
je určen k přiřazení 1 k nextfile
proměnná, ale hlásí chybu v gawk
i pod POSIXLY_CORRECT).