在bash shell中,我想採取一個與正則表達式匹配的給定字符串,然後取出字符串的一部分。在bash shell中匹配正則表達式的字符串的子串
例如,給出https://github.com/PatrickConway/repo-name.git
,我想提取repo-name
子串。
我該怎麼做呢?我應該在shell腳本中完成這一切,還是有另一種方法來解決這個問題?
在bash shell中,我想採取一個與正則表達式匹配的給定字符串,然後取出字符串的一部分。在bash shell中匹配正則表達式的字符串的子串
例如,給出https://github.com/PatrickConway/repo-name.git
,我想提取repo-name
子串。
我該怎麼做呢?我應該在shell腳本中完成這一切,還是有另一種方法來解決這個問題?
下面是做這件事的bash
Ÿ方式:
var="https://github.com/PatrickConway/repo-name.git"
basevar=${var##*/}
echo ${basevar%.*}
...這給repo-name
@CasimiretHippolyte非常好的一點! - 相應編輯 –
完美工作。謝謝! –
可以使用=~
匹配操作者一個[[ ... ]]
條件內:
#!/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
%
從右邊刪除,#
從左邊刪除,符號加倍使匹配貪婪,即通配符嘗試儘可能匹配。
謝謝!神奇的解釋 - 正是我所期待的。我試圖用一個複雜的正則表達式來使用grep ......這會好得多! –
做你想要的東西。你有沒有做過任何嘗試? – 123