bash shell中字符串匹配正则表达式的子字符串[重复]

Posted

技术标签:

【中文标题】bash shell中字符串匹配正则表达式的子字符串[重复]【英文标题】:Substring of string matching regex in a bash shell [duplicate] 【发布时间】:2017-11-09 07:47:40 【问题描述】:

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

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

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

【问题讨论】:

随心所欲。到目前为止,您是否进行过任何尝试? String contains a substring in Bash 可能重复。 【参考方案1】:

这是bashy 的做法:

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

...给repo-name

【讨论】:

@CasimiretHippolyte 非常好! - 相应地编辑 完美运行。谢谢! 好参考:tldp.org/LDP/abs/html/string-manipulation.html【参考方案2】:

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

#!/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 与复杂的正则表达式一起使用……这要好得多!

以上是关于bash shell中字符串匹配正则表达式的子字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Shell ❀ 正则表达式

Shell ❀ 正则表达式

Shell ❀ 正则表达式

第10章 Shell编程_正则表达式

linux shell:bash 正则表达式判断操作符 =~ 的问题

shell 正则匹配一条字符串并且获取该字符串中所有匹配到的字符