2017-06-07 32 views
0

在bash shell中,我想採取一個與正則表達式匹配的給定字符串,然後取出字符串的一部分。在bash shell中匹配正則表達式的字符串的子串

例如,給出https://github.com/PatrickConway/repo-name.git,我想提取repo-name子串。

我該怎麼做呢?我應該在shell腳本中完成這一切,還是有另一種方法來解決這個問題?

+2

做你想要的東西。你有沒有做過任何嘗試? – 123

回答

2

下面是做這件事的bashŸ方式:

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

...這給repo-name

+0

@CasimiretHippolyte非常好的一點! - 相應編輯 –

+0

完美工作。謝謝! –

4

可以使用=~匹配操作者一個[[ ... ]]條件內:

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

括在括號中的每個部分創建一個捕獲組,相應的匹配子串可以在BASH_REMATCH陣列在相同的位置被發現。

  • [...]定義字符類
  • [/]由單個字符的字符類匹配,斜線
  • ^否定字符類,[^/]匹配任何不是斜線
  • *手段「零或更多次「
  • \.匹配一個點,因爲.沒有反斜槓匹配任何字符

因此,它記住:記住非斜槓的子字符串,後跟一個點和「git」。

或者,也許一個簡單的參數擴展:

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

%從右邊刪除,#從左邊刪除,符號加倍使匹配貪婪,即通配符嘗試儘可能匹配。

+0

謝謝!神奇的解釋 - 正是我所期待的。我試圖用一個複雜的正則表達式來使用grep ......這會好得多! –

相關問題