wie Regex für sed escapen?

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Kryptaesthesie, 25.08.2009.

  1. #1 Kryptaesthesie, 25.08.2009
    Kryptaesthesie

    Kryptaesthesie Jungspund

    Dabei seit:
    02.02.2006
    Beiträge:
    23
    Zustimmungen:
    0
    Ort:
    NRW
    Mahlzeit :)

    Ich habe eine Datei, vom Aufbau her etwa so:
    Code:
    Zeile 1
    Zeile 2
    Zeile 3
    <modi value="ENTW"/>
    Zeile 5
    Zeile 6
    
    Ziel soll es sein, die Zeile <modi zu ersetzen.
    Den Regex habe ich und laut The Regex Coach funktioniert der auch, wie gewünscht. :)

    Jetzt möchte ich das aber gerne in einem Script machen.
    Also habe ich mir sed aus der Werkzeugkiste geholt. Leider komme ich mit dem Escapen nicht klar.
    So sieht mein Script aus:
    Code:
    echo "vorher:"
    echo
    cat /home/ich/test_verzeichnis/datei_mit_inhalt.txt
    echo
    echo
    echo
    echo "nachher:"
    echo
    sed -e 's/(<(?i)(modi))\s+value=\"\w*\"\/?>(<\/(?i)(modi)>)?/NEUER_WERT/g' /home/ich/test_verzeichnis/datei_mit_inhalt.txt
    echo
    
    # normaler Ausdruck:   (<(?i)(modi))\s+value="\w*"/?>(</(?i)(modi)>)?
    # Ausdruck escaped:    (<(?i)(modi))\s+value="\w*"\/?>(<\/(?i)(modi)>)?
    
    Es kommt kein Fehler, aber ersetzt wird auch nichts. :(
    Wie, was, wo muss ich da noch escapen?

    Ach ja, dass das nach dem Script derzeit noch nicht in der Datei ersetzt wird, sondern auf stdout schreibt, ist mir bekannt. Aber ich wollte auch erst mal nur den sed-Befehl zum Laufen kriegen! :)

    Danke für eure Hilfe!
    Gruß
    Gerrit
     
  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. #2 bytepool, 25.08.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    du machst dir das Leben aber schwer.

    Ich wuerde ein anderes Trennzeichen fuer sed benutzen, z.B. $ oder |, um das escapen der slashs zu vermeiden (e.g. sed 's$foo$bar$g').

    Das eigentliche Problem duerften aber die ganzen Klammern sein, ich sehe keinen Grund fuer die vielen Klammern. Wenn das Gruppierungen sein sollen muessen die Klammern auch alle noch escaped werden, aber ich wuerde sie einfach komplett weglassen.

    Dann enthaelt der Ausdruck noch eine Menge Krams der fuer dein Beispiel ueberhaupt nicht gebraucht wird (?i und so Spielchen). Ich wuerde immer mit dem simpelsten Ausdruck anfangen der funktioniert, und dann erst nach und nach die Sonderfaelle hinzufuegen.

    mfg,
    bytepool
     
  4. #3 Kryptaesthesie, 25.08.2009
    Kryptaesthesie

    Kryptaesthesie Jungspund

    Dabei seit:
    02.02.2006
    Beiträge:
    23
    Zustimmungen:
    0
    Ort:
    NRW
    Okay, ich habe das Script und auch den Regex noch mal angepasst:
    Code:
    echo "vorher:"
    echo
    cat /home/xyz/test_verzeichnis/datei_mit_inhalt.txt
    echo
    echo
    echo
    echo "nachher:"
    echo
    sed -e 's|<(?i)modi\s+value="\w*"\/?>(<\/(?i)modi>)?|NEUER_WERT|g' /home/xyz/test_verzeichnis/datei_mit_inhalt.txt
    echo
    
    # normaler Ausdruck:   <(?i)modi\s+value="\w*"/?>(</(?i)modi>)?
    # Ausdruck escaped:    <(?i)modi\s+value="\w*"\/?>(<\/(?i)modi>)?
    
    Leider ändert das an dem Ergebnis nichts. Auch nicht, wenn ich die Klammern escape.

    Im Anhang ist ein Screenshot, der zeigt, warum der Regex mehr macht, als für das obrige Bsp. nötig.
    Aber sicher lässt der sich noch optimieren!


    Gruß
    Gerrit
     

    Anhänge:

  5. #4 bytepool, 25.08.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    kann es sein, dass die komische (?i) Konstruktion fuer "case-insensitive" steht? Also dass er Gross- und Kleinschreibung ignorieren soll? Das wuerde ungefaehr zu dem Screenshot passen. Das wird in sed so aber nicht funktionieren, das ist keine Standard regex Syntax.

    Wenn du sowohl auf Gross- als auch auf Kleinschreibung matchen willst, macht man das normalerweise eher so:
    Code:
    [Mm][Oo][Dd][Ii]
    
    mfg,
    bytepool
     
  6. karru

    karru OSX'ler

    Dabei seit:
    02.05.2006
    Beiträge:
    338
    Zustimmungen:
    0
    Unter der Annahme, dass zwischen <modi ...></modi> nie etwas steht:
    Code:
    sed -e 's#<modi\s+value="\(\w*\)"\s*(/>|></modi>)#\1#ig' /home/xyz/test_verzeichnis/datei_mit_inhalt.txt
    Ungetestet...

    btw. zwischen unterschiedlichen sed-Versionen bestehen teilweise Unterschiede in Syntax oder anderem...
     
  7. #6 Kryptaesthesie, 26.08.2009
    Kryptaesthesie

    Kryptaesthesie Jungspund

    Dabei seit:
    02.02.2006
    Beiträge:
    23
    Zustimmungen:
    0
    Ort:
    NRW
    so, nun klappt's! :-)

    Guten Morgen :)

    Ich danke euch für eure Hilfe! :)
    Ich habe es nun hinbekommen und es sieht nun so aus:
    Code:
    echo "vorher:"
    echo
    cat /home/xyz/test_verzeichnis/datei_mit_inhalt.txt
    echo
    echo
    echo
    echo "nachher:"
    echo
    sed -e 's#<[Mm][Oo][Dd][Ii]\s\+value="\w*"\s\?/\?>\(</[Mm][Oo][Dd][Ii]>\)\?#ABC#ig' /home/xyz/test_verzeichnis/datei_mit_inhalt.txt
    echo
    
    
    
    ### ermittelt nur die kurze Schreibweise:   <modi value="LIVE" />
    # normaler Ausdruck:   <[Mm][Oo][Dd][Ii]\s+value="\w*"\s?/>
    # Ausdruck escaped:    <[Mm][Oo][Dd][Ii]\s\+value="\w*"\s\?/>
    
    
    ### ermittelt die lange Schreibweise:   <MODI value="LIVE"></MODI>
    # normaler Ausdruck:   <[Mm][Oo][Dd][Ii]\s+value="\w*"\s?/?>(</[Mm][Oo][Dd][Ii]>)?
    # Ausdruck escaped:    <[Mm][Oo][Dd][Ii]\s\+value="\w*"\s\?/\?>\(</[Mm][Oo][Dd][Ii]>\)\?
    
    Gruß
    Gerrit
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. #7 bytepool, 26.08.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    eine kosmetische Sache noch. Statt die ganzen echo's einzeln zu schreiben, kannst du auch echo -e mit \n fuer die Zeilenvorschuebe benutzen, also z.B.:
    Code:
    echo -e "\n\n\nnachher\n"
    
    Ist wie gesagt rein kosmetisch, aber dann blaeht sich der Code nicht so auf.

    mfg,
    bytepool
     
  10. #8 Kryptaesthesie, 26.08.2009
    Kryptaesthesie

    Kryptaesthesie Jungspund

    Dabei seit:
    02.02.2006
    Beiträge:
    23
    Zustimmungen:
    0
    Ort:
    NRW
    Danke für den Hinweis!
    Im richtigen / endgültigen Script ist das schon mit \n umgesetzt. Ist wirklich weniger aufgebläht. :)

    Gruß
    Gerrit
     
Thema:

wie Regex für sed escapen?

Die Seite wird geladen...

wie Regex für sed escapen? - Ähnliche Themen

  1. regexp für alle user einer bestimmten Maildomain

    regexp für alle user einer bestimmten Maildomain: Hallo, ich brauche den regulären Ausdruck, der mir erlaubt alle Mailadressen von firma.de zu filtern. Ich habe es schon mit folgenden...
  2. RegExp für "Wort|NN"

    RegExp für "Wort|NN": Hallo zusammen, ich habe eine Textdatei mit einigen tausend Zeilen, die in etwa so aussehen: ---------- Absenkung|NN -0.3434 Absenkungen...
  3. Überprüfen ob System.in leer ist / Regex Pattern für Whitespace

    Überprüfen ob System.in leer ist / Regex Pattern für Whitespace: Hi, hat jemand eine Idee wie ich überprüfen kann, ob nichts per stdin übergeben wird? ich lese den Sysin per BufferedReader sysin = new...
  4. RegExp für einzelnes Wort

    RegExp für einzelnes Wort: Hi, weiß jemand welcher Reguläre Ausdruck genau das erste (n-te) Wort einer Zeile meint? Mfg Sebi
  5. sed mit basename verknüpfen - oder anders Dateipfade in Dateien mit regex ersetzen?

    sed mit basename verknüpfen - oder anders Dateipfade in Dateien mit regex ersetzen?: Hallo, mein Ziel ist es ein Script zu schreiben, das eine CSS-Datei entgegen nimmt und in dieser Datei Pfade ersetzt. Ich möchte bspw....