2015-07-07 26 views
5

übereinstimmen In einem Bash-Skript muss ich Zeichenfolgen übereinstimmen, die mit genau 3 mal mit der Zeichenfolge lo beginnen; so lololoba ist gut, loloba ist schlecht, lololololoba ist gut, balololo ist schlecht.Wie Zeichenfolge (mit regulärem Ausdruck), die mit einer Zeichenfolge beginnt

Ich habe versucht mit diesem Muster: "^$str1/{$n,}" aber es funktioniert nicht, wie kann ich es tun?

EDIT:

Nach OPs Kommentar ist lololololoba jetzt schlecht.

+1

Was ist '(lo) {3}'? – NightShadeQueen

+3

Also mehr als 3 Vorkommen von 'lo' sind auch gut? – anubhava

+3

@anubhava Ich denke es ist aber das 'genau 'ist verwirrend. – 123

Antwort

3

können Sie folgende regex verwenden:

^(lo){3}.*$ 

Statt lo Sie Ihre Variable setzen.

Siehe Demo https://regex101.com/r/sI8zQ6/1

+3

Keine Notwendigkeit für die '. * $' - es tut nichts nützliches. Auch wenn dies ein gültiger regulärer Ausdruck ist, ist es keine vollständige Antwort, ohne zu zeigen, wie er verwendet wird (z. B. mit "grep -E"). –

+1

Was ist der Sinn des \ 1? Warum passen Sie die Saite nicht einfach dreimal an? – 123

+0

@TomFenech Ja, du hast Recht, aber ich wollte einen Hinweis geben anstatt die komplette Antwort! – Kasramvd

6

Dies sollte funktionieren:

pat="^(lo){3}" 
s="lolololoba" 
[[ $s =~ $pat ]] && echo good || echo bad 

EDIT (Stand OPs Kommentar):

Wenn Sie genau 3 mal übereinstimmen soll (dh lolololoba und so sollte nicht übereinstimmend sein):

ändern Sie die pat="^(lo){3}" zu:

pat="^(lo){3}(l[^o]|[^l].)" 
+0

Es ist perfekt! Vielen Dank! – Jaeger

0

Sie dieses awk können genau 3 Vorkommen von lo am Anfang zum Spiel:

# input file 
cat file 
lololoba 
balololo 
loloba 
lololololoba 
lololo 

# awk command to print only valid lines 
awk -F '^(lo){3}' 'NF == 2 && !($2 ~ /^lo/)' file 
lololoba 
lololo 
0

Wie pro Ihr Kommentar:

... more than 3 is bad so "lolololoba" is not good! 

Sie werden feststellen, dass @ Jahids Antwort passt nicht (da er dir diese Test-Saite "gut" gibt).

Um seine Antwort mit der richtigen regex zu verwenden:

pat="^(lo){3}(?\!lo)" 
s="lolololoba" 
[[ $s =~ $pat ]] && echo good || echo bad 

Dies bestätigt, dass es am Anfang drei „lo“ s sind, und nicht ein anderer sofort die drei folgenden.

Beachten Sie, dass, wenn Sie bash verwenden Sie werden feststellen, dass ! in der ersten Zeile entkommen müssen (was meine Regex oben tut)

+0

's =" lololoba "' gibt schlecht – Jahid

+0

Ich habe ein anderes Muster hinzugefügt, wenn Sie interessiert sind. – Jahid

Verwandte Themen