在bash中从正则表达式捕获组

时间:2016-06-27 14:42:46

标签: regex bash

我有以下字符串my-jar,我正在尝试编写一个bash正则表达式来提取([^\/]*?)-\d

现在我相信以下正则表达式会起作用:echo '/path/to/my-jar-1.0.jar' | grep -Po '([^\/]*?)-\d'但我不知道如何让bash运行它。

以下内容:my-jar-1捕获ModelUnitTests

3 个答案:

答案 0 :(得分:4)

在BASH,你可以这样做:

mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
mlocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 4000, 0, listener);

此处s='/path/to/my-jar-1.0.jar' [[ $s =~ .*/([^/[:digit:]]+)-[[:digit:]] ]] && echo "${BASH_REMATCH[1]}" my-jar 将打印捕获的组#1,它是第一个"${BASH_REMATCH[1]}"内的表达式。

答案 1 :(得分:2)

您也可以使用shell前缀和后缀删除来执行此操作:

function myFunction() {
    var c = document.querySelectorAll(".example>a"); 
    for(i=0;i<c.length;i++)
    {
        c[i].innerHTML = "Click Me!";           
    } 
}

虽然必须分两步进行转换有点烦人,但它的优点是只使用Posix功能,因此它可以与任何兼容的shell一起使用。

注意:顺序很重要,因为基本名称不能包含斜杠,但路径组件可能包含短划线。所以你需要先删除路径组件。

答案 2 :(得分:0)

grep -o无法识别&#34;捕获群组&#34;我想,就是整场比赛。也就是说,使用Perl regexps(-P),你可以看到&#34;前瞻&#34;从匹配项中排除-\d的选项:

echo '/path/to/my-jar-1.0.jar' | grep -Po '[^/]*(?=-\d)'

前瞻/后视的一些参考资料: http://www.perlmonks.org/?node_id=518444