2017-06-07 6 views
0

In einer Bash-Shell möchte ich die Take eine gegebene Zeichenfolge, die eine Regex entspricht, und dann den Teil der Zeichenfolge nehmen.Teilstring der Zeichenkette passenden Regex in einer Bash-Shell

Zum Beispiel, gegeben https://github.com/PatrickConway/repo-name.git, ich möchte die repo-name Teilzeichenfolge extrahieren.

Wie würde ich das machen? Soll ich das alles in einem Shell-Skript machen, oder gibt es eine andere Möglichkeit, sich diesem zu nähern?

+2

tun es gibt Sie wollen. Haben Sie bisher irgendwelche Versuche unternommen? – 123

Antwort

2

Hier ist ein bash y Art und Weise tun:

var="https://github.com/PatrickConway/repo-name.git" 
basevar=${var##*/} 
echo ${basevar%.*} 

... die aber repo-name

+0

@CasimiretHippolyte sehr guter Punkt! - entsprechend bearbeitet –

+0

Funktioniert perfekt. Vielen Dank! –

4

Sie die =~ Anpassungsoperator in einem Zustand [[ ... ]] verwenden:

#!/bin/bash 
url=https://github.com/PatrickConway/repo-name.git 
if [[ $url =~ ([^/]*)\.git ]] ; then 
    echo "${BASH_REMATCH[1]}" 
fi 

Jeder in Klammern schafft eine Capture-Gruppe, die entsprechende zusammenpassende Teilzeichen eingeschlossenen Teil kann in der gleichen Position in dem Array BASH_REMATCH gefunden werden.

  • [...] definiert eine Zeichenklasse
  • [/] eine Zeichenklasse entspricht ein einzelnes Zeichen besteht, einen Schrägstrich
  • ^ eine Zeichenklasse negiert, Streichhölzer [^/] alles andere als ein slash
  • * bedeutet „Null oder mehrmalig "
  • \. entspricht einem Punkt, da . ohne Backslash mit einem beliebigen Zeichen
  • übereinstimmt

Also, es liest: erinnere mich an einen Teilstring von Nicht-Schrägstrichen, gefolgt von einem Punkt und "Git".

Oder vielleicht eine einfache Parameter Expansion:

#!/bin/bash 
url=https://github.com/PatrickConway/repo-name.git 
url_without_extension=${url%.git} 
name=${url_without_extension##*/} 
echo $name 

% entfernt von rechts, # von links entfernt, das Symbol Verdoppelung macht die Anpassung gierig, das heißt Platzhalter so viel wie möglich zu entsprechen versuchen.

+0

Danke! Fantastische Erklärung - genau das, wonach ich gesucht habe. Ich habe versucht, Grep mit einer komplexen Regex zu verwenden ... das ist viel besser! –

Verwandte Themen