ubuntuusers.de

Stringmanipulation in bash script

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

Herbststurm

Anmeldungsdatum:
27. Mai 2011

Beiträge: 244

Hallo

ich habe eine Textdatei. Wie kann ich in einer Bestimmten Zeile, sagen wir die erste, die Strings zwischen einem Bestimmten Zeichenbereich einzeln ausgeben? Klingt etwas unverständlich. Verzeihung. Ich gebe ein Minimalbeispiel:

Angenommen ich habe in der ersten Zeile von file.txt folgendes stehen:

blablablasdfsdflshfosndlgnhduihgkdbnfklgdjkfbgkljdfhgjkbdfg

Dann ist gelb markiert das siebte Zeichen bis zum 10 Zeichen. Wie kann ich diesen String, hier "blas" extrahieren?

Danke und Grüße

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Wenn Du den String sowieso in einer Datei oder einer Pipe hast, ist wahrscheinlich sed am handlichsten:

track@lucid:~$ echo blablablasdfsdflshfosndlgnhduihgkdbnfklgdjkfbgkljdfhgjkbdfg  |  sed -r 's/.{6}(.{4}).*/\1/'
blas 

Sonst, wenn der String als Variable vorliegt, geht das auch mit einer Parameter Expansion:

track@lucid:~$ var=blablablasdfsdflshfosndlgnhduihgkdbnfklgdjkfbgkljdfhgjkbdfg
track@lucid:~$ echo ${var:6:4}
blas 

LG,

track

Herbststurm

(Themenstarter)

Anmeldungsdatum:
27. Mai 2011

Beiträge: 244

nice ☺ Vielen Dank für die Antwort. Probiere ich gleich morgen aus

Herbststurm

(Themenstarter)

Anmeldungsdatum:
27. Mai 2011

Beiträge: 244

Die Neugier hat es mich gleich testen lassen. Ich erhalte dabei immer den Fehler Bad substitution

ich machs mal konkreter: ich habe mir die Variable var_DAX wie folgt erstellt:

1
var_DAX=$(wget -nv -qO- http://www.onvista.de/realtime/DAX)

was mir komischerweise nur eine Zeile mit vielen Tausend Spalten ausgibt. So sieht zumindest das Dokument aus, wenn ich

1
echo $var_DAX >> ./var_DAX.txt 

verwende.

Nun möchte ich von Spalte 6441 bis 6450 den Punktestand des DAX ausgeben lassen. Hab deine Lösung versucht aber weiss nicht wo das Problem ist ☹

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ha ! ... schon mal was von "quoten" gehört ?

Und dann ist das ein HTML- Dokument, sowas mit einem Zeichen- basierten Werkzeug schlachten zu wollen ist sowieso Wahnsinn.

HTML basiert auf Tags, also nimmt man sinnigerweise auch ein Tag- basiertes Werkzeug.
In diesem Fall also wahrscheinlich die XML-HTML- Tools oder xidel  oder sowas.

Jetzt müsstest Du mir nur mal verraten, was Du aus dieser Seite tatsächlich haben willst ...

LG,

track


Edit:
Ein ganz andere Ansatz wäre, die HTML- Umwandlung durch einen CL-Webbrowser zu machen, und dann z.B. die Text-Tabelle mit den üblichen Verdächigen (= sed / awk) auszuwerten. Also sowas:

w3m -I windows-1252 http://www.onvista.de/realtime/DAX  |  grep "Aktien " -A35

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

track schrieb:

Wenn Du den String sowieso in einer Datei oder einer Pipe hast, ist wahrscheinlich sed am handlichsten:

track@lucid:~$ echo blablablasdfsdflshfosndlgnhduihgkdbnfklgdjkfbgkljdfhgjkbdfg  |  sed -r 's/.{6}(.{4}).*/\1/'
blas 

Da finde ich aber cut bedeutend handlicher:

$ echo blablablasdfsdflshfosndlgnhduihgkdbnfklgdjkfbgkljdfhgjkbdfg | cut -c 7-10
blas 

Herbststurm schrieb:

ich machs mal konkreter: ich habe mir die Variable var_DAX wie folgt erstellt:

1
var_DAX=$(wget -nv -qO- http://www.onvista.de/realtime/DAX)

In so einem Fall würde ich lieber curl nehmen. wget ist besser beim Spiegeln von ganzen Webseiten etc.

was mir komischerweise nur eine Zeile mit vielen Tausend Spalten ausgibt. So sieht zumindest das Dokument aus, wenn ich

1
echo $var_DAX >> ./var_DAX.txt 

Warum speicherst Du die Ausgabe erst in einer Variablen und dann in einer Datei?

Nun möchte ich von Spalte 6441 bis 6450 den Punktestand des DAX ausgeben lassen. Hab deine Lösung versucht aber weiss nicht wo das Problem ist ☹

Da es sich hier um eine HTML-Seite handelt, kannst Du nicht davon ausgehen, dass die Positionen immer gleich sind. Du bist hier mit einem Werkzeug zur Bearbeitung von Tag-basierten Sprachen besser dran. Nimm z.B. xmlstarlet oder Ruby:

1
2
3
4
5
6
require 'open-uri'
require 'nokogiri'

dom = open('http://www.onvista.de/realtime/DAX') {|io| Nokogiri.HTML(io)}

puts dom.xpath('//li[a/text()="DAX"]/text()').last.to_s.strip

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

rklm schrieb:

Da finde ich aber cut bedeutend handlicher:

$ echo blablablasdfsdflshfosndlgnhduihgkdbnfklgdjkfbgkljdfhgjkbdfg | cut -c 7-10
blas 

Es gibt ein ziemlich schlagendes Argument dagegen, - nämlich dass das utf-8 nicht unterstützt:

$ echo blüblablasdfsdflshfosndlgnhduihgkdbnfklgdjkfbgkljdfhgjkbdfg | cut -c 7-10
abla 

Es war zudem absehbar, dass da auch noch eine Zeilenauswahl dazu kommt. Das macht sed nebenbei mit, cut nicht.
Ansonsten hatte ich auch an eine Lösung mit grep -oP und lookbehind gedacht. Aber so richtig Spaß macht das auch nicht.

LG,

track

Antworten |