sed zwei und mehr leerzeichen durch ; ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
nihilist
Beiträge: 430
Registriert: 27.04.2006 21:17:06
Kontaktdaten:

sed zwei und mehr leerzeichen durch ; ersetzen

Beitrag von nihilist » 07.02.2011 19:58:46

Ich möchte die Ausgabe von dpkg -l mit Trennzeichen versehen, so das man sie evtl per csv in eine db importieren kann.
mit

Code: Alles auswählen

dpkg -l |  sed "s/  \+/;/g" 
wird alles was zwei Leerzeichen und mehr hat durch ';' ersetzt.
Ausgabe:
[...]
ii;urlview;0.9-18.1;Extracts URLs from text
ii;usbutils;1:001-1;Linux USB utilities
ii;util-linux;2.17.2-9;Miscellaneous system utilities
ii;vim;2:7.3.035+hg~8fdc12103333-1 Vi IMproved - enhanced vi editor
ii;vim-common;2:7.3.035+hg~8fdc12103333-1 Vi IMproved - Common files
ii;vim-runtime;2:7.3.035+hg~8fdc12103333-1 Vi IMproved - Runtime files
ii;vim-scripts;20091011;plugins for vim, adding bells and whistles
ii;vim-tiny;2:7.3.035+hg~8fdc12103333-1 Vi IMproved - enhanced vi editor - compact version
ii;vorbis-tools;1.4.0-1;several Ogg Vorbis tools
ii;weechat;0.3.4-1;Fast, light and extensible chat client
[...]

Das klappt auch wunderbar, nur bei dem markiertem wird zwischen der Versionsangabe und Beschreibung nichts ersetzt.
Woran liegt das?

Edit:
bei einem

Code: Alles auswählen

#dpkg -l 

ii  vim                                                   2:7.3.035+hg~8fdc12103333-1                           Vi IMproved - enhanced vi editor
ii  vim-common                                            2:7.3.035+hg~8fdc12103333-1                           Vi IMproved - Common files
ii  vim-runtime                                           2:7.3.035+hg~8fdc12103333-1                           Vi IMproved - Runtime files
werden genug leerzeichen angezeigt, hängt man aber ein grep dahinter sieht das schon anders aus.

Code: Alles auswählen

# dpkg -l | grep vim
ii  vim                                 2:7.3.035+hg~8fdc12103333-1 Vi IMproved - enhanced vi editor
ii  vim-common                          2:7.3.035+hg~8fdc12103333-1 Vi IMproved - Common files
ii  vim-runtime                         2:7.3.035+hg~8fdc12103333-1 Vi IMproved - Runtime files
ii  vim-scripts                         20091011                    plugins for vim, adding bells and whistles
ii  vim-tiny                            2:7.3.035+hg~8fdc12103333-1 Vi IMproved - enhanced vi editor - compact version

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: sed zwei und mehr leerzeichen durch ; ersetzen

Beitrag von syssi » 08.02.2011 00:09:03

Hier einfach ein alternativer Loesungsansatz:

Code: Alles auswählen

dpkg -l | awk '{printf "%s;%s;%s;",$1,$2,$3; for (i=4;i<NF+1;i++) {printf "%s ",$i};print ""}'

nihilist
Beiträge: 430
Registriert: 27.04.2006 21:17:06
Kontaktdaten:

Re: sed zwei und mehr leerzeichen durch ; ersetzen

Beitrag von nihilist » 08.02.2011 16:32:36

Dein oneliner tut das was ich wollte. Danke. :)

Magst du noch kurz erklären wie das genau funktioniert? (Insbesondere der Teil (i=4;i<NF+1;i++) )

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: sed zwei und mehr leerzeichen durch ; ersetzen

Beitrag von syssi » 08.02.2011 21:17:47

Mit Awk kann man ziemlich einfach "Spalten schnappen" spielen besonders, wenn die Abstände ein bisschen variieren, da ist awk ziemlich tolerant.

Code: Alles auswählen

echo erste zwei dritte | awk '{ print $2 }'
Obiger Schnippsel schnappt sich also Spalte 2. Mit "cut" haettest du es so geloest:

Code: Alles auswählen

echo erste zwei dritte | cut -d" " -f2
Cut ist jedoch nicht so tolerant beim Trennzeichen. Jedoch praktischer bei der Spaltenauswahl:

Code: Alles auswählen

echo erste zwei dritte | cut -d" " -f2-
Das Minus ("bis") waehlt Spalten nach der Zweiten. Gleiches Verhalten haette ich gerne mit AWK erzeugt. Bei AWK geht dies leider nicht so fix, deshalb muss man sich eine Schleife basteln, die von Spalte-x bis Ende ("NF") laeuft. Die Beschreibung bestellt also aus unbekannt vielen Spalten, welche alle hinten angefuegt werden.

Gruss syssi

Antworten