ubuntuusers.de

for-Schleife: Dateinamenerweiterung herausfiltern

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

maplecut

Avatar von maplecut

Anmeldungsdatum:
7. Februar 2011

Beiträge: 239

Wohnort: Oberschwaben

Um eine Messdatenübersicht mit Gnuplot zu erstellen, filtere ich mit einem Script aus mehreren Hunderttausend xml-Dateien die xml-Tags heraus, etwa nach dem Schema:

for i in *.xml; do sed 's/<\/analogchannel>/ /g' < "$i" > "$i".dat; done

Aus <dateiname>.xml wird dabei <dateiname>.xml.dat

Gibt es eine Möglichkeit, die Erweiterung der Eingabedatei zu unterdrücken, so dass die Ausgabedatei nur <dateiname>.dat heißt?

Grüße maplecut

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

Hallo,

Zum Beispiel mit basename:

for i in *.xml; do sed 's/<\/analogchannel>/ /g' < "$i" > "`basename -s xml $i`"dat; done

Grüße, Keba

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ja, gibt es. Das einfachste wäre eine Parameter Expansion:

for i in *.xml; do sed 's/<\/analogchannel>/ /g' < "$i" > "${i%.*}.dat"; done

Allerdings empfiehlt es sich sehr, zum Parsen von XML-Dateien xmlstarlet zu verwenden (das Tag-orientiert arbeitet !!) und nicht zeilenorientierte Tools wie sed .

LG,

track

maplecut

(Themenstarter)
Avatar von maplecut

Anmeldungsdatum:
7. Februar 2011

Beiträge: 239

Wohnort: Oberschwaben

Danke, Keba und track! Gibt es zwischen

"${i%.*}.dat"

und

"`basename -s xml $i`"dat

einen grundlegenden Unterschied, z.B. bei der Verarbeitungsgeschwindigkeit?

Ansonsten sieht xmlstarlet gut aus. Habe kurz ein Tutorial überflogen und denke, dass ich mich da kurzfristig einarbeiten werde.

Danke!

maplecut

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

Hallo,

"${i%.*}.dat"

ist schneller, da kein externes Programm aufgerufen wird und funktioniert auch bei Dateien, die nicht im gleichen Verzeichnis liegen. Falls du also etwas wie for i in data/*.xml machen möchtest, scheitert mein Code auch.

Dafür sollte die basename-Variante in fast allen Shells, nicht nur in der Bash funktioniern…

Grüße, Keba.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Servus,

Keba schrieb:

Dafür sollte die basename-Variante in fast allen Shells, nicht nur in der Bash funktioniern…

die Parameter Expansion von track steht auch in POSIX 2008.

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02

Das sollte eigentlich nicht so das Problem sein, das zu verwenden.

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

Hallo,

Vain schrieb:

die Parameter Expansion von track steht auch in POSIX 2008.

Oh, dann hab ich nichts gesagt ☺

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

maplecut schrieb:

Danke, Keba und track! Gibt es zwischen

"${i%.*}.dat"

und

"`basename -s xml $i`"dat

einen grundlegenden Unterschied, z.B. bei der Verarbeitungsgeschwindigkeit?

Auf einem etwas angestaubten System braucht basename 2ms pro Datei, und ist damit um Größenordnungen langsamer, als Stringexpansion, bei der ca. 10 Dateien pro Millisekunde durchrutschen.

Um den Faktor 20 langsamer klingt zwar beeindruckend, aber 2ms sind schon für viele Fälle unerheblich wenig - gemessen an der Zeit, die xmlstarlet oder sed benötigen ist das also ein Nix.

maplecut schrieb:

Ansonsten sieht xmlstarlet gut aus. Habe kurz ein Tutorial überflogen und denke, dass ich mich da kurzfristig einarbeiten werde.

Das passt insofern gut, als wir noch keinen Wikiartikel dazu haben. 😉

Antworten |