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】:这是bash
y 的做法:
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中字符串匹配正则表达式的子字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章