Geschütztes Leerzeichen in einem Shell-Script verwenden

Mr. Brooks

Lt. Commander
Registriert
Aug. 2011
Beiträge
1.441
Hi,

ich habe ein Script, dass mir meine ganze MP3-Sammlung automatisch taggt. Nicht alle sind nach dem Schema

Code:
/media/musik/artist/album/title.mp3

gespeichert. Bei vielen hab ich nur ein paar Lieder pro Interpret die ich dann in

Code:
/media/musik/aaa

gespeichert hab. aaa einfach damit es ganz oben steht. Bei den MP3-Tags hab ich den Tracks in aaa einfach keinen Album-Tag, sondern nur Title und Artist zugeordnet. Da wird dann leider immer nur der Title im Autoradio angezeigt. Wenn ich irgendwas als Album eintrage, werden alle Tags angezeigt. Ich hab erstmal einfach 'aaa' als Album-Tag schreiben lassen. Könnte man hier auch ein geschütztes Leerzeichen eintragen? Wie müsste ich das in einem Shell-Script eintragen? Vmtl. gibt es dafür einen Code, die in der Wikipedia hinterlegten werden aber einfach alle als Zeichenkette übernommen.

Das Radio unterstützt das so, ich konnte das ganze schon manuell mit MP3Tag (unter Windows mit der Tastenkombi ALT+0160) einfügen. Ein normales Leerzeichen geht aber nicht.
 
den string in anführungszeichen packen oder mit backslash escapen -> "mein tag mit leerzeichen" bzw so\ geht\ es\ auch.
 
  • Gefällt mir
Reaktionen: madmax2010
In der Shell müsste es \xA0 sein (bei UTF-8), allerdings werden in den ID3-Versionen ja auch unterschiedliche Kodierungen genutzt. ID3v1 konnte glaub ich nur ASCII-zeichen, die neueren können auch UTF-8 bzw. UTF-16.
Daher könnte es also auch drauf ankommen, welche Tag-Version du nutzt bzw dein Autoradio unterstützt.

@0x8100 er will ja nicht das normale Leerzeichen sondern non-breaking space
 
Ich nutze ausschließlich v2.3 und da sind alle UTF-16. Das wird scheinbar automatisch auf UTF-16 gestellt.

Mit

Code:
\xA0

wird einfach genau der Text eingefügt
 
Vielleicht kann der von dir genutzte mp3-editor das auch einfach nicht. Welcher ist es denn überhaupt?
Bei mp3info müsste es laut Escape Sequences damit eigentlich funktionieren.
 
Ich nutze eyed3, ist ein Kommandozeilenprogramm. MP3Tag hab ich nutzt genutzt weil ich in deren Forum auf die schnelle was zu gesch. LZ gefunden hab.
 
In der Doku werden nur einige wenige Special Characters aufgelistet. Dann unterstützt es das vielleicht tatsächlich nicht...
 
Es funktioniert so generell in der Kommandozeile nicht. Auch wenn ich einfach

Code:
echo text\xA0text > output

ausführe, wird kein Leerzeichen eingefügt.
 
Hast du es denn mal damit probiert, \<Non-Breaking Space> in die Konsole einzugeben?
Der Backslash als Escape Character sorgt bei eyed3 ja eigentlich nur dafür, dass das folgende Zeichen nicht extra als Argument ausgewertet wird, sondern als String.
 
Mr. Brooks schrieb:
Es funktioniert so generell in der Kommandozeile nicht. Auch wenn ich einfach

Code:
echo text\xA0text > output

ausführe, wird kein Leerzeichen eingefügt.
Das ist auch so nicht korrekt. echo "text text" > output ist richtig. Da mußt Du nichts separat quoten oder escapen. Da darf die Codierung nicht jucken, wenn der Zeichensatz in den Umgebungsvariablen entsprechend korrekt gesetzt wurde.
 
Das ist aber ein normales und kein geschütztes Leerzeichen.
 
vielleicht mit einem doppelten Backslash? weil der eine gehört ja zum Sonderzeichen, einen zweiten damit das als Sonderzeichen erkannt wird.

Also ich hab das nicht getestet aber schon oft so gesehen,
allerdings nicht in Bash: echo text\\xA0text > output
 
Mr. Brooks schrieb:
Das ist aber ein normales und kein geschütztes Leerzeichen.
Jetzt mal blöde gefragt: Gibts sowas im Betriebssystem auf Dateiebene überhaupt? Ich bezweifle das. Ein Dateisystem ist ja keine Textverarbeitung oder andere typografische Anwendung, wo das überhaupt sinnvoll wäre. Ich halte es sowieso für eine Krankheit, Leerzeichen in Dateien oder Ordner zu verwenden, weil das einfach immer eine Menge Probleme macht, bis heute. Für viele Dateien verwende ich bis heute _ oder . anstelle Leerzeichen. Das macht das Parsieren usw. wesentlich einfacher und bequemer. Man darf eben nicht vergessen, unter Unix ist ein Leerzeichen immer ein Trenner für Parameter, weshalb es sich hier schon per se verbietet, Leerzeichen in Dateien zu verwenden.

Daher halte ich hier Deinen Ansatz mit den Leerzeichen schon für fragwürdig. Vor allen Dingen, wie willst Du überhaupt sicherstellen, sobald Deine Datei das System, OS, Dateisysten wechselt, daß die vermeidlich geschützten Leerzeichen so erhalten bleiben? Geht in meines Wissens gar nicht. Sprich, da nützt Dir das geschützte Leerzeichen im Dateinamen (wenn es so was überhaupt gibt) nichts. Mit Unterstrich oder . machst Du dagegen kaum einen Fehler, das wird immer entsprechend 1:1 übersetzt.

Hier stehts zumindest für Windows drin:
https://docs.microsoft.com/en-us/tr...rience/file-folder-name-whitespace-characters

WinRT API​


The WinRT API is designed to support multiple data providers (Physical Drives, OneDrive, Facebook, etc.). To achieve this, WinRT API uses a search engine to enumerate files and folders. Due to the search approach to enumeration, the WinRT API (StorageFile, StorageFolder, etc.) does not handle file and folder names with trailing whitespace characters other than ASCII Space (0x20) and ASCII Period (0x2E) residing on a local or remote file system. It does handle leading non-ASCII whitespace characters.
Sprich, für das Dateisystem gibts nur 0x20, und nichts anderes. Für Unix und Linux habe ich hier erst mal nicht weiter interessantes gefunden.
 
Zuletzt bearbeitet:
@ PHuV

Erst lesen. Es geht nicht um Dateinamen, es geht um die MP3-Tags.

Das mit dem echo war nur ein Text ob man das überhaupt irgendwie im Terminal eingeben kann.
 
Dann mußt Du das auch klar so kennzeichnen. Dein (!) Beispiel echo text\xA0text > output geht nun mal auf Dateisystemebene, und das wollte ich damit sagen, funktioniert so nicht.

Ansonsten, ist das gleiche Problem in grün, Übergabe der speziellen Zeichen über Konsole. Wenn das nicht entsprechend unterstützt wird, und in Python die Strings in den entsprechenden Variablen nicht entsprechend gekennzeichnet oder speziell weiterverarbeitet werden, geht das nicht. Sprich, Du mußt entweder im Code selbst mal prüfen, wie hier die Weiterverarbeitung läuft, oder eben die Entwickler von eye3D mal anfragen, wie man mit geschützten Leerzeichen verfahren soll. Python selbst kann das wohl.

https://stackoverflow.com/questions/2594810/removing-non-breaking-spaces-from-strings-using-python
https://www.programmersought.com/article/35415094443/
 
Der Thread ist schon eine Weile alt, aber weil doch recht viel mit echo probiert und diskutiert wurde (und ich den Thread jetzt erst entdeckt habe), dachte ich könnte vielleicht beim Verständnis mit echo helfen :heilig:

Mr. Brooks schrieb:
Es funktioniert so generell in der Kommandozeile nicht. Auch wenn ich einfach

Code:
echo text\xA0text > output
ausführe, wird kein Leerzeichen eingefügt.
Hier fehlen zwei Dinge:
  • Anführungszeichen um den String (auch wenn echo es nicht grundsätzlich braucht und auch ohne funktioniert, trotzdem immer verwenden)
  • die Option "-e" für echo, damit Steuerungszeichen von echo interpretiert werden

Code:
$ echo -e "text\xA0text"
text�text
$ echo -e "text\xA0text" > test.txt
vi test.txt

Je nach System und Einstellung stellt vi das geschützte Leerzeichen auch dar.
Also grundsätzlich funktioniert es mit dem von kartoffelpü genannten Steuerzeichen (auf der Shell). Aber wie schon erwähnt unterstützt das Tool für die mp3Tags das Zeichen vielleicht nicht bzw. ersetzt oder verwirft es.
 
Zurück
Oben