Regex in Bash script greift nicht

B

bueno

Eroberer
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
 
ich bin mir recht sicher, daß das Zeichen für "Zeilenanfang" mitten drin in einer RegEx recht selten matchen wird...
 
hmmm okay, ich dachte [ ist der beginn einer regex? dann muss ich wohl auch die spitzklammern mit in die [] nehmen?
 
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...
 
Du musst die { und } maskieren / escapen...
Code:
echo "<1234><a>" | grep "<[0-9]\{4\}><[a-z]>"
 
Du musst die { und } maskieren / escapen...
Code:
echo "<1234><a>" | grep "<[0-9]\{4\}><[a-z]>"


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
 
Noch eine abschließende Frage, wie kann ich denn eine message weiterreichen zu dem "exit 1" zusätzlich? hab folgendes probiert:
[...]
jedoch wirft er dann auch bei gültigen comments einen fehler...
??? Ich verstehe leider nicht so recht, was Du erreichen willst...
 
vereinfacht: ist es möglich zusätzlich zum exit 1, bzw. davor noch ein echo "bla bla" zu machen?
 
ö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
 
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 :(
 

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)
 
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?
 
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
 

Ähnliche Themen

Problem mit Bash Script

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

Zurück
Oben