bash shell中字符串匹配regex的子字符串

Substring of string matching regex in a bash shell

本问题已经有最佳答案,请猛点这里访问。

在bash shell中,我想获取与regex匹配的给定字符串,然后获取该字符串的一部分。

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

我该怎么做呢?我应该在shell脚本中完成这一切,还是有其他方法来处理这一切?


您可以在[[ ... ]]条件内使用=~匹配运算符:

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

括号中的每个部分都创建了一个捕获组,相应的匹配子字符串可以在bash_重匹配数组的相同位置找到。

  • [...]定义字符类
  • [/]匹配由单个字符、斜线组成的字符类
  • ^否定字符类,[^/]只匹配斜线
  • *表示"零次或多次"
  • \.匹配一个点,因为没有反斜杠的.匹配任何字符

所以,它是这样写的:记住一个非斜杠的子字符串,后跟一个点和"git"。

或者简单的参数扩展:

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

%从右边删除,#从左边删除,符号加倍使匹配贪婪,即通配符尽量匹配。


这是一个bashY的方法:

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

…给了EDOCX1[12]