Ich dachte, dass Bash-Variablensubstitution und Globbing bei der Zeichenauflösung funktionieren , daher war ich ziemlich überrascht, dass es auf Byte- Ebene funktioniert .
Alles in meinem locale
ist en_AU.UTF-8
Wenn nichts übereinstimmt und das Muster Null-zu-Viele zulässt, erfolgt die Ersetzung auf Byte- Ebene, wie durch nachfolgende Ersetzungen gesehen wird. Ich hätte erwartet, dass es zum nächsten Charakter übergeht , aber es tut es nicht ...
Vielleicht ist dies nur ein verrücktes Randmuster, oder ich vermisse etwas Offensichtliches, aber ich frage mich, was hier vor sich geht, und kann ich dieses Verhalten anderswo als in diesem bestimmten Muster erwarten?
Hier ist das Skript (das als Versuch begann, eine Zeichenfolge in Zeichen aufzuteilen).
Ich habe erwartet, dass der letzte Test mit Zeichen ळ
nur ein einziges Leerzeichen vor ळ
dem Zeichen hat, aber stattdessen wird den 3 UTF-8-Bytes des Zeichens jeweils ein Leerzeichen vorangestellt. Dies führt zu einer ungültigen UTF-8-Ausgabe.
shopt -s extglob
for str in $'\t' "ab" ळ ;do
printf -- '%s' "${str//*($'\x01')/ }" |xxd
done
Ausgabe:
0000000: 2009 .
0000000: 2061 2062 a b
0000000: 20e0 20a4 20b3 . . .
quelle
Antworten:
Die kurze Antwort auf Ihre Frage lautet, dass * (Musterliste) mit null oder mehr Vorkommen der angegebenen Muster übereinstimmt. Zwischen jedem der Eingangsbytes befinden sich null Instanzen des Unicode-Zeichens 0001. Die Ersetzungsoperation ersetzt also jede dieser Nullinstanzen durch ein einzelnes Leerzeichen.
Vielleicht wollten Sie das tun:
Die längere Antwort lautet jedoch, dass Pfadnamen auf keinen Fall Text sind. Zumindest sind sie nicht so weit wie das (Unix-ähnliche) Betriebssystem. Sie sind Byte-Sequenzen. Das Problem ist, dass solche Dinge trivial sind:
Jedes dieser Gebietsschemas enthält Zeichen, die in den anderen nicht vorhanden sind. Dieses Problem betrifft auch Dinge wie locate -r und find -regex . Das Argument von locate -r ist ein regulärer Ausdruck, der daher die Unterstützung von Dingen wie Zeichenklassen beinhalten muss. Sie wissen jedoch nicht, mit welchem Gebietsschema Sie die Zeichenklassen für die Zeichen in den Pfadnamen bestimmen sollen oder ob es ein einziges verwendbares Gebietsschema gibt, mit dem alle Pfade im System dargestellt werden können.
quelle
${str//@($'\xB3')/w}
nur das letzte (UTF-8) Byte vonळ
(\ xB3) durch die Zeichenfolgew
(\ x77) ersetzt werden kann , und das tut es auch! Auch${str//*($'\xB3')/w}
sollte dazu führen77e0 77a4 77
, und es tut! .. Danke James. Also, das würde bedeuten , dass in der Antwort, sollte es lesen Es sind keine Fälle von Unicode - Zeichen 0001 zwischen jedem der Eingangsbytes (nicht Zeichen) .