• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] grep-Frage und Backreferenz-Oparator

Mr.Tito

Member
Hallo alle,

nun habe ich mich zumindest schonmal soweit durchgewurstelt, dass ich mein Problem vermutlich mit den oben genannten begriffen lösen kann. Da ihr mir nun am Handumdrehen helfen könnt, hier mal mein einfaches Anliegen:
Ich erhalte eine XML-Datei, von der ich den Inhalt des Tags "STRASSE" auslesen möchte. Das ganze sieht also so aus:

....
<STRASSE>Meine Strasse 123b</STRASSE>
<ORT>37983 Ein Wohnort</ORT>
....

Wie erhalte ich in meinem Bash-Script den Wert "Meine Strasse 123b"??
Versucht habe ich bis jetzt z.B. sowas:
cat Datei.xml | grep '<STRASSE>(.*)</STRASSE>\1'

Mein bestes Ergebnis gab mir aber immer die komplette Zeile aus.

Die ganze Satzstruktur gibts übrigens immer nur einmal, d.h. es gibt keine zweite STRASSE.

Da die Lösung für halbwegs geübte ja wohl eher ein einfacher regulärer Ausdruck ist, sollte mir jemand einen goldenen Tip geben können ;)

Danke schonmal
 
A

Anonymous

Gast
muss es wirklich unbedingt grep sein ? oder geht auch sed

Code:
...... | sed 's/<STRASSE>\(.*\)<\/STRASSE>/\1/g '
sollte so gehen hab im Moment allerdings nur ein Fenster-Betriebssystem kann es also schlecht testen.

robi
 
A

Anonymous

Gast
haveaniceday schrieb:
Code:
...... | sed -n 's/^.*<STRASSE>\(.*\)<\/STRASSE>.*$/\1/p '
So würde ich das mal versuchen.
Stimm natürlich :eek:ps: sonst gibt er ja die anderen Zeilen alle auch noch mit aus, ist eben schlecht sowas rein aus dem Kopf heraus zusammen bauen zu wollen, ohne Möglichkeit es zu testen.

robi

PS: weitere Möglichkeiten zB awk
Code:
...... | awk -F"[><]" '/<STRASSE>/{print $3}'
Diese Zeile würde voraussetzten das der gesuchte Inhalt immer ganau nach dem 2. Vorkommen von "<" und/oder ">" in der STASSEN-Zeile steht.

nur mit GREP alleine wird es äußerst schwierig, Man könnte solch einen Spagat zB hier mal versuchen.
Code:
 .......  | grep "<STRASSE>" | grep -o '>.*<' | grep -o '[^>].*[^<]'
Ist aber sehr anfällig wenn eventuell mal etwas mehr in der Zeile steht, kommt wohl nichts vernünftiges dabei raus.

robi
 

framp

Moderator
Teammitglied
Der folgende in einer bash aufgerufene perl Einzeiler gibt alle Strassen aus:
Code:
 perl -n -e 'if (/<STRASSE>(.*)<\/STRASSE>/) { print "$1\n" }' Datei.xml
 
Oben