ubuntuusers.de

printf mit Sonderzeichen

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

hellmi666

Avatar von hellmi666

Anmeldungsdatum:
30. August 2007

Beiträge: 238

Wohnort: Zwickau

Hallo liebe Leute,

ich habe ein Problem mit der Darstellung einer Ausgabe mittels printf unter gedit.

Ich habe die Ausgabe in einer Tabelle so angeordnet, dass der linke Teil rechtsbündig und der rechte Teil linksbündig dargestellt wird mittels

1
printf "%35s  %-30s\n" "$interpret" "$album" >> ~/Liste

Wenn aber Sonderzeichen, wie ä,ö,ü,ß oder é enthalten sind rutscht die Ausgabe um die Anzahl nach links, Beispiel

1
2
3
4
5
6
7
133	                        Amon Amarth  2006 - With Oden On Our Side  
134	                        Amon Amarth  2006 - Wrath Of The Norsemen  
135	                        Amon Amarth  2008 - Twilight Of The Thunder God
136	                        Amon Düül  1969 - Psychedelic Underground
544	                             Charon  2003 - The Dying Daylights    
545	                               Ché  2000 - Sounds Of Liberation   
546	                           Chevelle  2002 - Wonder Whats Next     

Die Zeile von Amon Düül ist um zwei Zeichen und die von Ché um ein Zeichen nach links verschoben. Wie kann ich das verhindern?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Das Problem ist, dass printf immer Bytes zählt, und nicht komplette Zeichen (→ siehe hier).

Deshalb geht das bei den Multibyte-Zeichen von utf-8 so einfach nicht. Du wirst Dir also wohl oder übel einen Basteltrick einfallen lasssen müssen, um diesen Effekt zu korrigieren.

LG,

track

hellmi666

(Themenstarter)
Avatar von hellmi666

Anmeldungsdatum:
30. August 2007

Beiträge: 238

Wohnort: Zwickau

Das habe ich befürchtet, trotzdem danke für deine Antwort.

Da fällt mir ein: kann man die Ausgabe nicht auch anders bewerkstelligen, ohne printf, also eine 2-spaltige Tabelle?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

... wie ich schon sagte, man braucht einen Trick.

Eine solche Möglichkeit wäre die Parameter Expansion "Länge der Variablen" (die sehr wohl Zeichen zählt !)
und dann eine Arithmetic Expansion, mit der Du die Leerzeichen exakt zuteilst:

l=${#interpret}
printf "%$((35-l))s%s  %-30s\n" " " "$interpret" "$album"

LG,

track

hellmi666

(Themenstarter)
Avatar von hellmi666

Anmeldungsdatum:
30. August 2007

Beiträge: 238

Wohnort: Zwickau

Du bist der GRÖSSTE. Danke es klappt. Woher weiss man denn solche Sachen?

Du hast mir schon so oft geholfen, ich weiss gar nicht, wie ich das jemals wieder gut machen kann.

Ein schönes Wochenende wünsche ich dir. Tschau

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

hellmi666 schrieb:

... Woher weiss man denn solche Sachen?

Na ja, sowas sammelt sich im Laufe der Zeit ...
Ok, printf fällt weg, denn es funktioniert überall gleich, egal ob bei awk, Perl oder sonstwo, und sed kann nicht zählen.

Also muss man Zeichen zählen. Ja awk hat die length() , aber das ist zu kompliziert. Aber bei den Parameter Expansions, da war doch was ...
😉 (... klar, weil man's irgendwann mal gelesen hat !)

Es gibt übrigens noch eine Möglichkeit, da gibt es einen Shell- Befehl, der vorhandenen Worte in Spalten aufteilen kann.
Der ist aber ziemlich "automatisch", und außerdem habe ich vergessen, wie der heißt ... (tja, das passiert mir also auch !)

... und mit dem Wiedergutmachen - hilf doch mit Deinen Erkenntnissen einfach eine Runde hier mit auf dem Forum !
Das ist die beste Art, der Gemeinschaft wieder etwas zurückzugeben. ☺

LG,

track

Antworten |