bash shell 中匹配正则表达式的字符串的子字符串

Pat*_*way 4 regex unix bash substring

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

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

我该怎么做呢?我应该在 shell 脚本中完成这一切,还是有其他方法来解决这个问题?

cho*_*oba 5

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

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

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

  • [...]定义一个字符类
  • [/]匹配由单个字符、斜杠组成的字符类
  • ^否定字符类,[^/]匹配除斜杠之外的任何内容
  • *意思是“零次或多次”
  • \.匹配一个点,就像.没有反斜杠匹配任何字符一样

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

或者也许是一个简单的参数扩展:

#!/bin/bash
url=https://github.com/PatrickConway/repo-name.git
url_without_extension=${url%.git}
name=${url_without_extension##*/}
echo $name
Run Code Online (Sandbox Code Playgroud)

%从右边删除,#从左边删除,加倍符号使匹配变得贪婪,即通配符尝试尽可能多地匹配。