string herausfischen mit sed oder awk

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von dosenfleisch, 16.12.2007.

  1. #1 dosenfleisch, 16.12.2007
    Zuletzt bearbeitet: 16.12.2007
    dosenfleisch

    dosenfleisch Foren As

    Dabei seit:
    29.03.2007
    Beiträge:
    75
    Zustimmungen:
    0
    hallo,

    schreibe schon seit einiger zeit bash-scripte, habe aber bisher sed und awk immer irgendwie umschiffen können. gerade sed erscheint mir bei euren code-schnipseln immer wahnsinnig mächtig, aber auch undurchsichtig.

    nun möchte ich nichts weiter tun, als aus einer xml-datei den string zwischen
    <title> und </title>
    herausfiltern um ihn dann weiter zu verarbeiten.
    dieser "title-tag" kann in dieser datei (atomfeed) häufiger vorkommen und ich möchte jeweils den inhalt .

    Code:
    sed -n /<title>/,</title>/pg datei 
    #oder
    sed -n /<title>/,<\/title>/pg datei 
    
    sollte es doch eigentlich schaffen. funktioniert aber leider nicht.
    die xml-datei läuft übrigens über zwei zeilen.

    worin besteht bei meinem code der fehler?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. L0s3r

    L0s3r Tripel-As

    Dabei seit:
    22.09.2007
    Beiträge:
    216
    Zustimmungen:
    0
    Ort:
    MV
    quick and dirty
    Code:
    cat input.xml | grep title | sed 's/<title>/;/' | sed 's/<\/title>/;/' | cut -d ";" -f 2
    So würde ich das auf die Schnelle machen. Sicherlich nicht die eleganteste Lösung aber läuft :D
    Der Fehler bei deinem Ansatz ist, dass du versuchst den String "<title>" durch ",</title>" zu ersetzen.
    Hier noch bissl was zu sed.
    http://www.fibel.org/linux/lfo-0.6.0/node170.html
     
  4. #3 dosenfleisch, 16.12.2007
    dosenfleisch

    dosenfleisch Foren As

    Dabei seit:
    29.03.2007
    Beiträge:
    75
    Zustimmungen:
    0
    danke L0s3r.

    und wie komme ich jetzt an alle in den title-tags enthaltene strings?
    <title> 1 </title>
    <title>2 </title>
    <title> 3 </title>
    alle in einer zeile mit anderen tags dzwischen.
    sicher mit einer schleife, aber ich weiß nicht wo diese ansetzt.
     
  5. L0s3r

    L0s3r Tripel-As

    Dabei seit:
    22.09.2007
    Beiträge:
    216
    Zustimmungen:
    0
    Ort:
    MV
    Zur erklärung:
    cat lädt die Datei, grep filtert alle zeilen raus die "title" enthalten, die beiden sed's ersetzen jeweils "<title>" und "</title>" durch ";" und cut gibt aus, was zwischen beiden ";" steht.
    Also beim Beispiel
    Code:
    <title> 1 </title>
    <title>2 </title>
    <title> 3 </title>
    wird dann
    Code:
    1
    2
    3
    ausgegeben.

    Edit: Der Teil mit dem Ersetzen von <title> zu ; ist leider notwendig weil cut nur ein einzelnes Zeichen als Trenner akzeptiert deswegen ist es wie gesagt nicht die eleganteste Lösung.
     
  6. #5 dosenfleisch, 16.12.2007
    dosenfleisch

    dosenfleisch Foren As

    Dabei seit:
    29.03.2007
    Beiträge:
    75
    Zustimmungen:
    0
    danke nochmal für die erklärung. bis auf den sed-teil war mir das schon verständlich, nun begreif ich aber auch den rest. :)

    aber:
    Code:
    while `cat testdatei`; do grep title | sed 's/<title>/;/' | sed 's/<\/title>/;/' | cut -d ";" -f 2 ; done
    
    auf diese testdatei angewandt:
    Code:
    <title> 1 </title><title> 2 </title><title> 3 </title>
    
    führt zu
    Code:
    ...: line 5: <title>: command not found
    
     
  7. L0s3r

    L0s3r Tripel-As

    Dabei seit:
    22.09.2007
    Beiträge:
    216
    Zustimmungen:
    0
    Ort:
    MV
    Ja da haut was mit der while-Schleife nicht hin und bei dieser Konstellation in der Testdatei klappt auch der Rest nicht mehr weil dann nur der erste Titel ausgegeben wird und das ist ja nicht Sinn der Übung. Wie sieht denn die Originaldatei nun aus?
     
  8. #7 dosenfleisch, 16.12.2007
    dosenfleisch

    dosenfleisch Foren As

    Dabei seit:
    29.03.2007
    Beiträge:
    75
    Zustimmungen:
    0
    ich muß um entschuldigung bitten. ich habe da verschiedenes in einen topf gehauen.
    also:

    Code:
    cat testdatei | grep title | sed 's/<title>/;/' | sed 's/<\/title>/;/' | cut -d ";" -f 2 
    
    auf diese testdatei angewandt:
    Code:
    <title> 1 </title><title> 2 </title><title> 3 </title>
    
    führt zu:
    Code:
    1
    
    also soweit alles okay, bis auf die tatsache, daß ich nur den ersten title erhalte.


    das ist der atomfeed von google:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <feed version="0.3" xmlns="http://purl.org/atom/ns#"><title>Gmail - Inbox for blabla@gmail.com</title><tagline>New messages in your Gmail Inbox</tagline><fullcount>2</fullcount><link rel="alternate" href="http://mail.google.com/mail" type="text/html"/><modified>2007-12-16T16:38:30Z</modified><entry><title>Ihre Teilnahme am ... .</title><summary>weitere erklaerungen &amp;hellip;</summary><link rel="alternate" href="http://mail.google.com/mail?account_id=klopapier%40gmail.com&amp;message_id=111f&amp;view=conv&amp;extsrc=atom" type="text/html"/><modified>2007-12-14T16:46:15Z</modified><issued>2007-12-14T16:46:15Z</issued><id>tag:gmail.google.com,2004:36656</id><author><name>flup flop.</name><email>news@news.flammplupp.com</email></author></entry><entry><title>meintitel</title><summary>hier die summery &amp;hellip;</summary><link rel="alternate" href="http://mail.google.com/mail?account_id=blabla%40gmail.com&amp;message_id=b0c3853&amp;view=conv&amp;extsrc=atom" type="text/html"/><modified>2007-11-20T17:00:12Z</modified><issued>2007-11-20T17:00:12Z</issued><id>tag:gmail.google.com,2004:1253655</id><author><name>Icke </name><email>dingdong@dada.info</email></author></entry></feed>
    
    da sind also zwei emails drin enthalten.
    beide titel will ich haben, vllt später auch mehr, nur mir fehlt die technik.
     
  9. L0s3r

    L0s3r Tripel-As

    Dabei seit:
    22.09.2007
    Beiträge:
    216
    Zustimmungen:
    0
    Ort:
    MV
    Es wird immer schmutziger :D
    Code:
    cat test | grep title | sed -e 's/<title>/+/g' -e 's/<\/title>/+/g' | cut -d "+" -f "2,4,6,8"
    Den Trenner von ";" auf "+" umgestellt weil ";" auch an anderen Stellen auftaucht. Mit der Variante müsstest du die Zahlenfolge 2,4,6,8 weiterführen je nachdem wie viele Titel rausgefischt werden sollen. Vllt hat ja jemand doch noch was eleganteres ^^
     
  10. P17

    P17 Schandensbegrenzer

    Dabei seit:
    06.12.2007
    Beiträge:
    196
    Zustimmungen:
    0
    Ort:
    Germany
    useless use of cat
    warum nicht einfach
    Code:
    grep 'title' | sed 's/<[^>]*>//g' datei.xml
     
  11. #10 dosenfleisch, 16.12.2007
    dosenfleisch

    dosenfleisch Foren As

    Dabei seit:
    29.03.2007
    Beiträge:
    75
    Zustimmungen:
    0
    @L0s3r
    das funktioniert jetzt. ich muß nur noch die title voneinander trennen, aber das wiederum sollte ich mit cut oder sed allein hinkriegen. danke!

    @P17
    wenn die tags alle weg sind, finde ich die titel gar nicht mehr, oder habe ich da was übersehen?
     
  12. L0s3r

    L0s3r Tripel-As

    Dabei seit:
    22.09.2007
    Beiträge:
    216
    Zustimmungen:
    0
    Ort:
    MV
    Also wenn ich das hier durchlaufen lasse sind die Titel durch ein "+" getrennt.
     
  13. #12 dosenfleisch, 16.12.2007
    dosenfleisch

    dosenfleisch Foren As

    Dabei seit:
    29.03.2007
    Beiträge:
    75
    Zustimmungen:
    0
    genau, sieht doch aber scheiße aus ;)
    ich hab's jetzt so:
    Code:
    mail=$(cat 'atomfeed' | grep title | sed -e 's/<title>/+/g' -e 's/<\/title>/+/g' | cut -d "+" -f "4,6,8,10,12")
    mail=$(sed 's/+/\n/' <<< "$mail")
    echo "$mail"
    
    ich danke dir!
     
  14. L0s3r

    L0s3r Tripel-As

    Dabei seit:
    22.09.2007
    Beiträge:
    216
    Zustimmungen:
    0
    Ort:
    MV
    Code:
    sed 's/+/\n/[B]g[/B]'
    kannst du noch an die Pipe anhängen
    Code:
    cat test | grep title | sed -e 's/<title>/+/g' -e 's/<\/title>/+/g' | cut -d "+" -f "2,4,6,8,10,12" | sed 's/+/\n/g'
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 dosenfleisch, 16.12.2007
    Zuletzt bearbeitet: 16.12.2007
    dosenfleisch

    dosenfleisch Foren As

    Dabei seit:
    29.03.2007
    Beiträge:
    75
    Zustimmungen:
    0
    ist mir auch grad in der wanne eingefallen :)

    edit:

    daraus ist jetzt ein schöner (kleiner) gmail-checker geworden.
    Code:
    wget -O atomfeed https://mail.google.com/gmail/feed/atom --http-user=mymail@gmail.com --http-password=mypass
    mail=$(cat 'atomfeed' | grep name | sed -e 's/<name>/+/g' -e 's/<\/name>/+/g' | cut -d "+" -f "2,4,6,8,10,12"| sed 's/+/\n/g')
    echo "$mail" | osd_cat -A right -p bottom -f -adobe-helvetica-*-*-*-*-18-*-*-*-*-*-*-* -c red -d 65 & > /dev/null
    
    funzt nur, wenn die osd-tools bzw osd-bin installiert sind und die schrift im system existiert.
     
  17. #15 Wolfgang, 16.12.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Sorry, aber das sieht grauenhaft aus.
    UUOC sagt Euch was?

    Sowas wie
    Code:
    cat file|grep "match"|sed ...
    ist mindestens einmal meist sogar zweimal sinnfrei.
    Code:
    grep "match" file 
    ...macht das Gleiche und spart einen Prozess!
    sed selbst nimmt auch eine Datei entgegen und kann auch selbst alles was nicht matcht ausfiltern. Damit haben wir schon zwei Prozesse gespart.
    Code:
    # falsch!
    cat file|grep "pattern"|sed ...
    # richtig
    sed -e /pattern/!d;...' file
    
    Löscht (ignoriert sie bei der Ausgabe) alle Zeilen aus file, die nicht auf pattern matchen.
    Genau das tut das sinnlose
    Code:
    cat file|grep "pattern"| sed...
    ... auch.

    Nur mal so am Rande bemerkt.
    Die Erklärung von L0s3r
    ist leider total falsch.

    Bei dem Versuch wird nix ersetzt, sondern die Addressierung verwendet.
    das muss scheitern, da diese zeilenorientiert arbeitet.
    genauer bedeutet das:
    Code:
    sed -n /<title>/,</title>/pg datei 
    
    -n nicht ausgeben
    /<title>/,</title>/p alle Zeilen beachten die mit Zeile startet welche <title> enthält und solange weiter beachten, bis eine Zeile kommt die </title> enthält. Da ist noch ein Syntaxfehler drin. Du musst den Slash schützen (Escapen).

    Eine Ersetzung setzt ein s/find/replace/ vorraus.
    y geht auch, arbeitet dann wie tr.
    Aber hier ist ein Adressbereichsanfang verwendet, wobei das Ende syntaktisch falsch ist.
    Sed versucht also mit Adressbereichen zu arbeiten, und scheitert dann wegen Syntaxfehler.
    Das g am Ende ist sinnlos und falsch (Syntaxfehler), was dir sed sicher auch gemeldet hat.

    Das nur zur Richtigstellung.

    Nix für ungut, aber das musste ich loswerden.
    Hier soll ja keine falsche Info stehenbleiben, andere könnten später auch davon profitieren wollen.

    Also nicht persönlich nehmen.
    Gruß Wolfgang.
     
Thema:

string herausfischen mit sed oder awk

Die Seite wird geladen...

string herausfischen mit sed oder awk - Ähnliche Themen

  1. FIND mit UND-Verknüpfung im Suchstring

    FIND mit UND-Verknüpfung im Suchstring: Hallo, ich schaffe es einfach nicht bei folgendem Kommando die Suchoptionen zu erweitern, damit nur Dateien beginnend mit "T_*" aufgelistet...
  2. String auf Konsole ausgeben

    String auf Konsole ausgeben: Hallo zusammen, ich bin auf ein Problem gestoßen dass für mich sehr unverständlich ist, aber vllt übersehe ich auch etwas Offensichtliches. Es...
  3. String einer bestimmten Zeile durchsuchen

    String einer bestimmten Zeile durchsuchen: Hallo, wie kann ich den eine bestimmte Zeile einer Textdatei zerlegen und daraus ein Stück entnehmen? Ich suche nach der Zeile in der "model...
  4. alles außer letzte 4 strings

    alles außer letzte 4 strings: Hallo, ich habe verschieden lange Strings (Dateinamen) und möchte gerne den Dateinamen als Variable ausgeben: 1. Strings...
  5. Firefox erhält JavaScript-String-Optimierung

    Firefox erhält JavaScript-String-Optimierung: Eine Optimierung, die in Firefox 33 zu erwarten ist, wird für JavaScript-Strings wesentlich weniger Speicher benötigen. Damit wird in Firefox 33...