GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Einzelne Zeichen mit dem Null-String heraustrennen?

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 und
split ?

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).

Verwandte:Konvertieren Sie Genotypen in 0/1?

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).


Linux
  1. String-Ersetzung mit einem Wörterbuch?

  2. Verwendung von –exclude mit dem Du-Befehl?

  3. So teilen Sie eine Zeichenfolge in Bash-Skript auf

  4. Ausgabe des Befehls nach Spalten mit Bash aufteilen?

  5. Holen Sie sich die letzten 4 Zeichen der Ausgabe von Standardausgabe

Verwenden des kostenlosen Linux-Befehls

Verwenden der SSH-Konfigurationsdatei

Tutorial zur Verwendung des Timeout-Befehls unter Linux

Verwenden des tr-Befehls in Linux, um mit Charakteren zu spielen

Wie finde ich heraus, was den ganzen Speicherplatz auf meiner /-Partition belegt?

Wie finde ich heraus, über welche Schnittstelle ich mich mit dem Internet verbinde?