Der Befehl cut
verfügt über eine Option -c
, mit der Zeichen anstelle von Bytes bearbeitet werden können -b
. Aber das scheint im en_US.UTF-8
Gebietsschema nicht zu funktionieren :
Das zweite Byte gibt das zweite ASCII-Zeichen an (das in UTF-8 genauso codiert ist):
$ printf 'ABC' | cut -b 2
B
gibt aber nicht das zweite von drei griechischen Nicht-ASCII-Zeichen im UTF-8-Gebietsschema an:
$ printf 'αβγ' | cut -b 2
�
Das ist in Ordnung - es ist das zweite Byte .
Also schauen wir uns stattdessen das zweite Zeichen an:
$ printf 'αβγ' | cut -c 2
�
Das sieht kaputt aus.
Bei einigen Experimenten hat sich herausgestellt, dass der Bereich 3-4
das zweite Zeichen zeigt:
$ printf 'αβγ' | cut -c 3-4
β
Das ist aber genauso wie bei den Bytes 3 bis 4:
$ printf 'αβγ' | cut -b 3-4
β
Das -c
macht also nicht mehr als das -b
für UTF-8.
Ich würde erwarten, dass das Setup des Gebietsschemas für UTF-8 nicht richtig ist, aber im Vergleich dazu wc
wie erwartet funktioniert.
Es wird häufig zum Zählen von Bytes mit der Option -c
( --bytes
) verwendet.
(Beachten Sie die verwirrenden Optionsnamen.)
$ printf 'αβγ' | wc -c
6
Es können aber auch Zeichen mit option -m
( --chars
) gezählt werden, was einfach funktioniert:
$ printf 'αβγ' | wc -m
3
Meine Konfiguration scheint also in Ordnung zu sein - aber etwas Besonderes ist daran cut
.
Vielleicht unterstützt es UTF-8 überhaupt nicht? Aber es scheint , Multi-Byte - Zeichen zu unterstützen, sonst wäre es muß nicht unterstützen -b
und -c
.
Also, was ist falsch? Und warum?
Das Setup des Gebietsschemas sieht für utf8 richtig aus, soweit ich das beurteilen kann:
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Die Eingabe, byteweise:
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
quelle
-c
, als würde derselbe Code verwendet wie-b
. Hast du dir den Quellcode angesehen? Vielleicht findest du einen Hinweis, wofür-c
eigentlich gedacht ist.Antworten:
Sie haben nicht gesagt, welche
cut
Sie verwenden, aber da Sie die Option GNU long erwähnt haben,--characters
gehe ich davon aus, dass es diese ist. In diesem Fall beachten Sie diese Passage ausinfo coreutils 'cut invocation'
:(Betonung hinzugefügt)
Momentan
cut
funktioniert GNU immer in Form von Einzelbyte-Zeichen, daher wird das Verhalten, das Sie sehen, erwartet.Beide Unterstützung der
-b
und-c
Optionen wird von POSIX erforderlich - sie wurden zu GNU nicht hinzugefügt ,cut
weil es Multi-Byte - Unterstützung hatte und sie arbeiteten richtig, aber zu vermeiden Fehler auf POSIX-kompatiblen Eingang geben. Das Gleiche-c
wurde in einigen anderencut
Implementierungen gemacht, zumindest nicht in FreeBSD und OS X.Dies ist das historische Verhalten von
-c
.-b
wurde neu hinzugefügt, um die Byte-Rolle zu übernehmen,-c
damit mit Mehrbyte-Zeichen gearbeitet werden kann. Vielleicht funktioniert es in ein paar Jahren wie gewünscht, obwohl der Fortschritt nicht gerade schnell war (es ist bereits über ein Jahrzehnt her). GNUcut
implementiert die-n
Option noch nicht einmal, obwohl sie orthogonal ist und den Übergang erleichtern soll. Es gibt potenzielle Kompatibilitätsprobleme mit alten Skripten, die ein Problem sein können, obwohl ich nicht genau weiß, woran das liegt.quelle
tr
Dokumenten finden. und selbsttar
wenn ich mich nicht erinnere. Ich denke, es ist ein großes Projekt.cut
? Wo kann man zum Beispiel die Quellen für Patches herunterladencut
? Oder wäre es einfacher, ein anderes Dienstprogramm zu verwenden? (grep
Lösung unten funktioniert nicht reibungslos mit Bereichen, z. B.5-8,44-49
)cut -c
hier: superuser.com/questions/506164/...colrm
(ein Teil vonutil-linux
, sollte bereits auf den meisten Distributionen installiert sein) scheint die Internationalisierung viel besser zu beherrschen:Achten Sie auf die Nummerierung:
colrm N
Entfernt Spalten ausN
und druckt Zeichen bis zuN-1
.( Credits )
quelle
Da viele
grep
Implementierungen Multibyte-fähig sind, können Sie auchgrep -o
einige Verwendungen von simulierencut -c
.Passen Sie die Anzahl der Perioden an, um
cut
Bereiche zu simulieren .quelle