2013-07-15T21:10:19 reneeDa SID33 5 Zeichen lang ist, ist das Ergebnis ja korrekt, weil Du sagst, dass der Wert 4 Zeichen lang sein soll ([A-Z0-9]{4}). Wenn es *mindestens* 4 Zeichen lang sein soll, dann musst Du [A-Z0-9]{4,} schreiben...
QuoteWenn es *mindestens* 4 Zeichen lang sein soll, dann musst Du [A-Z0-9]{4,} schreiben.
2013-07-15T20:25:27 bora99hallo,
ich versuche in einer datei nach einem string zu suchen und nach trennung durch "=" den wert auszugeben. zwischen "=" können <tab>s oder <blank>s sein.
der länge des wertes ist 4 stellig. nach dem wert können auch kommentare durch "#" getrennt stehen.
bsp: ( im anhang )
die ersten 3 einträge ( suche nach "key" und ausgabe von SID* ) sollen gefunden werden. Nach "SID1" ist ein Leerzeichen
key = SID0
key = SID1
key = SID2 # kommentar, soll gefunden und ausgegeben werden
key = SID33 # kommentar, soll nicht gefunden und nicht ausgegeben werden
was ich nicht schaffe, SID33 rauszufiltern.
perl -lan -e 'if(/^([\s]*)key[\s]+=[\s]([A-Z0-9]{4})[\s]*$|[\s][\W]*$/i) {print "$F[2]" }' test.txt
QuoteDie -a Option macht hier IMHO keinen Sinn.
Außerdem verstehe ich nicht, warum Du die \s in eckige Klammern gepackt hast.
"SID33" kannst du rausfiltern indem Du nach [A-Z0-9]{4} mit \b eine "word boundary" verlangst.
[A-Z0-9]{4} mit \b eine "word boundary" verlangst
1
2
Ich würde es so schreiben (ungetestet):
perl -len 'print $1 if /^\s*key\s+=\s+([A-Z0-9]{4})\b/'
Quoteperl -lan -e 'if(/^(\s*)key\s+=\s([A-Z0-9]{4})\b/i) {print "$F[2]" }'
2013-07-16T06:46:09 bora99
QuoteStatt -len müssen die Kommandline-Optionen -ln -e sein. Dann funktioniert es.
-len
-ln -e
-lne
Guest wer[...]
Wenn du -len '...' stehen hast interpretiert das perl als -l -e '' -n -- '...'
[...]