Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Sed, egrep Zeilenbereich

  1. #1
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829

    Sed, egrep Zeilenbereich

    Wie kann ich anhand eines regulären Ausdrucks mehrere Zeilen
    zwischen 2 Tags finden?

    PHP-Code:
    Dies ist ein Text

    <TAG>
    Das soll
    gefunden 
        werden
    .
    </
    TAG>

    Dies noch ist ein Text 
    Alles was zwischen <TAG> und </TAG> steht soll gefunden werden,
    einschließlich Sonderzeichen und Whitespaces.

    Kann man das irgenwie mit egrep, Sed oder AWK verwirklichen?

    (Möchte auf Perl, PHP und Python in diesem Fall verzichten.)

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Code:
    sed -n "/<TAG>/,/<\/TAG>/p" < test.txt
    Wenn <TAG> allerdings mehrmals vorkommt dann wird alles zwischen dem ersten und dem letzten </TAG> ausgegeben.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.07.2003
    Beiträge
    118
    Zitat Zitat von peschmae
    [code]
    Wenn <TAG> allerdings mehrmals vorkommt dann wird alles zwischen dem ersten und dem letzten </TAG> ausgegeben.

    Klasse peschmae, das hilft schon mal.

    Kann man eventuell das Script so ändern, dass <TAG> und </TAG> nicht
    in der Ausgabe erscheinen?

    Könnte man nicht, wenn ein und die selben Tags mehrmals vorkommen,
    die jeweiligen Ausgabe in einem nummerischen Array (Shellarray) speichern?

    Das würde doch den Zugriff erheblich erleichtern.

    (Von Sed hab ich leider keinen Schimmer.)
    Das Geld wird nicht weniger, es wechselt nur den Besitzer...

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von Claudine
    Kann man eventuell das Script so ändern, dass <TAG> und </TAG> nicht
    in der Ausgabe erscheinen?
    Naja, einfach noch ein s#<.?TAG>## anhängen.

    Könnte man nicht, wenn ein und die selben Tags mehrmals vorkommen,
    die jeweiligen Ausgabe in einem nummerischen Array (Shellarray) speichern?
    Nein. Darum ist mein Post auch halb eine Frage. Sed-Regexps sind grundsätzlich immer "greedy" - d.h. immer so gross wie möglich. Wenn ich den Bereich wie oben Festlege matcht das _immer_ den allerersten <TAG> und den allerletzten </TAG>

    Soll das auch für mehrere <TAG></TAG>s gehen? Dann wirds etwas komplizierter - ich fang mal an

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    So, hier mal ein Sed-Script was einfach alles Zwischen <TAG> und </TAG>s ausgibt - allerdings noch keine Trennungsmöglichkeit von Text zwischem erstem und anderen <TAG></TAG>-Paaren.

    Ausführen: sed -n -f sedscript.sed data.txt
    Code:
    /<TAG>/ {
            h
            c
    }
    
    /<\/TAG>/ {
            H
            g
            s#<TAG>##
            s#</TAG>##
            p
    }
    
    H

    Wenn man beim p noch ein q (uit) anhängt wird nur die erste Fundstelle angegeben:
    Ausführen: sed -n -f sedscript.sed data.txt
    Code:
    /<TAG>/ {
            h
            c
    }
    
    /<\/TAG>/ {
            H
            g
            s#<TAG>##
            s#</TAG>##
            p
            q
    }
    
    H
    die kann man jetzt natürlich aus der Datei entfernen à la
    Code:
    sed -e "0,/<TAG>/d" -e "0,/<\/TAG>/d" -i data.txt
    und dann das Script auf die nächste Fundstelle loslassen. Eine schlauere Variante um die Daten aus sed nach Bash zu kriegen fällt mir eben gerade nicht ein.

    MfG Peschmä
    Geändert von peschmae (07-09-2004 um 20:19 Uhr)
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  6. #6
    Registrierter Benutzer
    Registriert seit
    02.07.2003
    Beiträge
    118
    Meine alte Gundschullehrerin sagte immer: Wenn Du das gut machst
    bekommst Du ein Bienchen.

    2 Bienchen für peschmae

    Der Trick mit dem Puffer is gut.

    Problem: Wie kann ich Sed eine Shellvariable interpretrieren lassen?

    s#</TAG>#$TRENNER#

    funktioniert leider nicht, wenn das Sed Script sich in einer seperaten Datei
    befindet.
    Das Geld wird nicht weniger, es wechselt nur den Besitzer...

  7. #7
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Da kenne ich keine Lösung ausser:

    - das Sed-Script mit sed s#PLATZHALT0R#$VARIABLE# zu bearbeiten
    - das ganze halt nicht in ein separates Sed-Script zu schreiben

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  8. #8
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87
    Es gibt doch mächtige XML parser, evtl. könnte man die bei dem Problem heranziehen?!

  9. #9
    Registrierter Benutzer
    Registriert seit
    02.07.2003
    Beiträge
    118
    Zitat Zitat von ThorstenS
    Es gibt doch mächtige XML parser, evtl. könnte man die bei dem Problem heranziehen?!
    Hast Du eventuell ein Beispiel zur Hand?
    Das Geld wird nicht weniger, es wechselt nur den Besitzer...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •