2017-03-08 2 views
0

Was wir haben:Wie Parts Teilstrings mit Leerzeichen in Shell-Variablen in bash?

In einem previous question wurden die folgenden Musterlinien ein Muster in bash zu erkennen vorgeschlagen passenden und Extrakt Teile dieser Linie in Shell-Variablen:

re='^\[([[:digit:]:]+)\] \[Server thread/INFO\]: ([^[:space:]]+) entered area ~ ([^[:space:]]+) - [(]PvP[)] ~' 
line='[18:51:10] [Server thread/INFO]: Tester121 entered area ~ Wilderness - (PvP) ~' 

if [[ $line =~ $re ]]; then 
    time=${BASH_REMATCH[1]} 
    player=${BASH_REMATCH[2]} 
    area=${BASH_REMATCH[3]} 
fi 

jedoch Dieser Code funktioniert nicht mit einer anderen Stelle, an der der übereinstimmende Inhalt Leerzeichen enthalten kann. Betrachten Sie das folgende weniger vereinfachte Format:

re='???' 
line='[19:27:14] [Server thread/INFO]: Tester121 entered area ~ City - Leader Tester777 - (No PvP) ~' 

if [[ $line =~ $re ]]; then 
    time=${BASH_REMATCH[1]} 
    player=${BASH_REMATCH[2]} 
    area=${BASH_REMATCH[3]} 
    #leader="Tester777" 
    leader=${BASH_REMATCH[4]} 
    #pvp="No PvP" 
    pvp=${BASH_REMATCH[5]} 
fi 

Was sollte die re für sie sein? Ich bin neu in Regex und versuche zu lernen.

+0

Es wäre ideal zu zeigen, was Sie versucht haben - also nicht nur ein 're = ???' Platzhalter, sondern speziell Ihr eigener Versuch, die Regex zu erweitern. –

+0

... übrigens, ich habe versucht, den Titel zu aktualisieren, um zu unterscheiden, wie sich diese Frage von der letzten unterscheidet. –

Antwort

2

Da Sie "Änderungen" erwähnen, nehme ich an, dass Sie nicht beide Fälle zusammenbringen sollen. Korrigiere mich, wenn ich falsch liege.

Und was ist so etwas wie:

\[([[:digit:]:]+)\] \[Server thread/INFO\]: ([^[:space:]]+) entered area ~ ([^[:space:]]+) - Leader ([^[:space:]]+) - \(([^)]*)\) ~ 

können Sie einen live preview here sehen.

mit Leerzeichen in es

Der Schlüssel hier ist \(([^)]*)\). Es passt alles innerhalb der Klammern an. Dies bedeutet natürlich, dass Sie dann keine verschachtelten (geschlossenen) Klammern haben können.

+1

Dieser Tester verwendet die PCRE-Syntax, aber der Operator bash '= ~' verwendet nur ERE. Einer der besonderen Unterschiede ist, dass ERE die Verwendung von '*?' Nicht unterstützt, um das Verhalten von '*' nicht gierig zu machen. –

+0

@CharlesDuffy Ohh, habe das nicht bemerkt! – Vallentin

+1

Wie bearbeitet, sieht das gut für mich aus - wie in, testet erfolgreich mit '[[$ line = ~ $ re]]' in bash. –

Verwandte Themen