2017-01-04 2 views
1

Etwas neu zu bash.Extrahieren Muster aus einer Zeichenfolge in einem Bash-Skript

Ich habe experimentiert mit Parametererweiterungen, grep, sed und echo, um dieses Problem zu lösen, aber kann es nicht ganz hinarbeiten.

Ich versuche, ein bestimmtes Muster aus $ PWD in einem Bash-Skript zu extrahieren.

Lasst uns sagen, dass es eine Vielzahl von vollständigen Pfade sein könnte:

/home/files/tmp8 
/home/tmp28/essential 
/home/tmp2/essential/log 
/home/files/tmp10/executables 
/tmp8/files/whatever/etc 

In jedem Fall möchte ich eine beliebige Zeichenfolge extrahieren, die „tmp“, gefolgt von 1 oder mehr ganze Zahlen enthält.

in jedem Fall also, in denen $ PWD verarbeitet wird, wird er zurückkehren „tmp8“, „tmp28“, „tmp2“ usw.

Erklärungen dafür, wie die Funktionen/Betreiber der Arbeit in Bezug auf dieses Problem zu lösen, würde auch sehr geschätzt werden.

Antwort

1

Verwenden grep -o nur abgestimmte Text mit regex tmp[0-9]* heißen Literaltext tmp gefolgt zeigt von 0 oder mehr Ziffern:

grep -o 'tmp[0-9]*' file 
tmp8 
tmp28 
tmp2 
tmp10 
tmp8 
+0

Vielen Dank für beide Erklärungen. Kann ich das extrahierte Muster einer Zeichenkette zuordnen oder in einem anderen Befehl verwenden? –

+1

Ja, Sie können 'str = $ (grep -o 'tmp [0-9] *' <<<" $ PWD ")' verwenden, um das extrahierte Muster einer Variablen 'str' zuzuordnen – anubhava

+1

' grep -o 'tmp [ 0-9] * '<<< "$ PWD" 'gibt nur den übereinstimmenden String ie' tmp 'nicht die vollständige Eingabe zurück. – anubhava

3

Sie reguläre Ausdrücke in bash verwenden können, um ein Muster von einem beliebigen Pfad Zeichenfolge zu extrahieren. Siehe das folgende Beispiel:

if [[ "$PWD" =~ ^.*(tmp[0-9]+).*$ ]] 
then 
    printf "match: ${BASH_REMATCH[1]}\n" 
else 
    printf "no match: $PWD\n" 
fi 

Der reguläre Ausdruck definiert eine Gruppe in der runden Klammer. Wenn der Ausdruck der übereinstimmenden Gruppe (tmp mit mindestens einer folgenden Ziffer) entspricht, wird er von Bash im Array BASH_REMATCH gespeichert.

Verwandte Themen