Regex in Bash script greift nicht

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von bueno, 15.09.2010.

  1. bueno

    bueno Eroberer

    Dabei seit:
    16.02.2006
    Beiträge:
    69
    Zustimmungen:
    0
    Ort:
    Wien
    Hey,

    ich arbeite an folgendem pre-commit hook: Die Entwickler sollen Comments in folgender Form eingeben: <####>:<Comment>

    Wobei in den ersten Spitzklammern eine 4 Stellige Zahl stehen sollte, danach ein Doppelpunkt, und in den zweiten Spitzklammern der Comment Text.

    Ich habe nun etwas rumgeschraubt und folgendes probiert (die pre-commit hook template geändert):
    Code:
    $SVNLOOK log -t "$TXN" "$REPOS" | \
       grep "<^[0-9]{4}$><[a-zA-Z0-9]+>" > /dev/null || exit 1
    
    ich denke es liegt an meiner komplexen regex, denn mit einer einfacheren funktionierts einwandfrei. Weiss jemand wie das hier richtig gehört?
    Was ich auch noch gerne hätte im Fehlerfall, dass er zusätzlich zum "exit 1" auch eine message wirft. Wie hänge ich das da richtig rein in den command?

    lg
     
  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. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.053
    Zustimmungen:
    8
    ich bin mir recht sicher, daß das Zeichen für "Zeilenanfang" mitten drin in einer RegEx recht selten matchen wird...
     
  4. bueno

    bueno Eroberer

    Dabei seit:
    16.02.2006
    Beiträge:
    69
    Zustimmungen:
    0
    Ort:
    Wien
    hmmm okay, ich dachte [ ist der beginn einer regex? dann muss ich wohl auch die spitzklammern mit in die [] nehmen?
     
  5. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.053
    Zustimmungen:
    8
  6. bueno

    bueno Eroberer

    Dabei seit:
    16.02.2006
    Beiträge:
    69
    Zustimmungen:
    0
    Ort:
    Wien
    okay, danke für den tipp, hab das gleichmal angepasst und probiere nun herum =/

    folgendes klappt einwandfrei:
    Code:
    <[0-9]><[a-z]>
    
    was mir jedoch nur jeweils 1 Zahl und 1 Buchstaben erlaubt. Sobald ich folgendes Versuche, klappt die regex nicht mehr (sollte jedoch 4 zahlen innerhalb der ersten < > akzeptieren, oder?):
    Code:
    <[0-9]{4}><[a-z]>
    
    Von dem Doppelpunkt ganz zu schweigen, den krieg ich erst recht nicht hin...
     
  7. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.053
    Zustimmungen:
    8
    Du musst die { und } maskieren / escapen...
    Code:
    echo "<1234><a>" | grep "<[0-9]\{4\}><[a-z]>"
     
  8. bueno

    bueno Eroberer

    Dabei seit:
    16.02.2006
    Beiträge:
    69
    Zustimmungen:
    0
    Ort:
    Wien

    super! danke, das hat mir vorübergehend das leben gerettet!
    Weißt du zufällig wie ich \s escapen muss? hab nun folgendes probiert:
    Code:
    <[0-9]\{4\}><[a-z0-9\\s]\+>
    
    ...mit doppelbackslash funktioniert das hier also nicht =/

    Noch eine abschließende Frage, wie kann ich denn eine message weiterreichen zu dem "exit 1" zusätzlich? hab folgendes probiert:
    Code:
    $SVNLOOK log -t "$TXN" "$REPOS" | \
       grep "<^[0-9]{4}$><[a-zA-Z0-9]+>" > /dev/null || echo "test message" 1>&2; exit 1
    
    jedoch wirft er dann auch bei gültigen comments einen fehler...
    Achja, und der Link zur Regex Seite ist wirklich sehr hilfreich! danke
     
  9. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.053
    Zustimmungen:
    8
    ??? Ich verstehe leider nicht so recht, was Du erreichen willst...
     
  10. bueno

    bueno Eroberer

    Dabei seit:
    16.02.2006
    Beiträge:
    69
    Zustimmungen:
    0
    Ort:
    Wien
    vereinfacht: ist es möglich zusätzlich zum exit 1, bzw. davor noch ein echo "bla bla" zu machen?
     
  11. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.053
    Zustimmungen:
    8
    öhm, macht das Ding doch:
    Code:
    echo "<1d234><a>" | grep "<[0-9]\{4\}><[a-z]>" > /dev/null || echo "test"
    test
    
    echo "<1234><a>" | grep "<[0-9]\{4\}><[a-z]>" > /dev/null || echo "test"
    
    echo "<1234><ab>" | grep "<[0-9]\{4\}><[a-z]>" > /dev/null || echo "test"
    test
    
     
  12. bueno

    bueno Eroberer

    Dabei seit:
    16.02.2006
    Beiträge:
    69
    Zustimmungen:
    0
    Ort:
    Wien
    okay, und ich bräuchte sowas wie:
    Code:
    echo "<1234><a>" | grep "<[0-9]\{4\}><[a-z]>" > /dev/null || echo "test"; exit 1
    
    jedoch ist ja in dem Beispiel jetzt die regex richtig, das heisst "test" sollte nicht angezeigt werden. AAABER "exit 1" führt er trotzdem aus! Ich möchte aber das exit auch nur ausführen, wenn die regex nicht übereinstimmt. Ich denke dass das Semikolon ";" hier der Störfaktor ist. Trennen mit normalem Leerzeichen führt auch nicht zum gewünschten :(
     
  13. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.053
    Zustimmungen:
    8
  14. bueno

    bueno Eroberer

    Dabei seit:
    16.02.2006
    Beiträge:
    69
    Zustimmungen:
    0
    Ort:
    Wien
    hab jetzt mal ne subshell gemacht mit den Klammern. Aber nun lässt er mir wieder alles durch und die regex greift nicht (in meinem fall), liegt wohl daran dass die subshell dann irgendwo anders das exit macht =/
    Code:
    $SVNLOOK log -t "$TXN" "$REPOS" | \
       grep "<[0-9]\{4\}>\:<.\+>" > /dev/null || (echo "Please insert a valid pattern: <####>:<Comment>"; exit 1)
    
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 Graf_Ithaka, 15.09.2010
    Graf_Ithaka

    Graf_Ithaka Routinier

    Dabei seit:
    29.01.2005
    Beiträge:
    487
    Zustimmungen:
    0
    Ort:
    Steiermark nahe Graz
    ich hab jetz zwar noch nie damit gearbeitet aber ich hab subshells so verstanden dass sie eigenständige shells sind (mit eigenen rückgabewerten). du müsstest also nach erfolgreichem aufruf der subshell deren rückgabewert prüfen und dementsprechend den rückgabewert für deine ursprüngliche shell anpassen. Oder hab ich dein Problem falsch verstanden?
     
  17. bueno

    bueno Eroberer

    Dabei seit:
    16.02.2006
    Beiträge:
    69
    Zustimmungen:
    0
    Ort:
    Wien
    danke für die hilfe jungs! Ich habs endlich geschafft, so sieht der entgültige pre-commit hook aus (geschrieben als bash script):

    Code:
    REPOS="$1"
    TXN="$2"
    
    # Make sure that the log message contains some text.
    SVNLOOK=/usr/bin/svnlook
    
    $SVNLOOK log -t "$TXN" "$REPOS" | \
       grep "<[0-9]\{4\}>\:<.\+>" > /dev/null || { echo "Please insert a valid pattern: <####>:<Comment>" >&2; exit 1; }
    
    
    # All checks passed, so allow the commit.
    exit 1
    
     
Thema:

Regex in Bash script greift nicht

Die Seite wird geladen...

Regex in Bash script greift nicht - Ähnliche Themen

  1. [bash] if-Abfrage mit RegEx

    [bash] if-Abfrage mit RegEx: Hallo, ich möchte in einem Bash-Skript prüfen, ob die an das Skript übergebene Variable "src_ip" eine IPv4-Adresse ist. Eine detaillierte...
  2. 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....
  3. RegEx Problem ... grep kein \. außer \.name

    RegEx Problem ... grep kein \. außer \.name: Hallo Leute, ich möchte gerne einen regulären ausdruck zum filtern bestimmter dateien außer 1 bestimmten. Konkret bedeutet das ich möchte alle...
  4. 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...
  5. 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...