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