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

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

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

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

【问题讨论】:

标签: regex bash unix substring


【解决方案1】:

这是bashy 的做法:

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

...给repo-name

【讨论】:

【解决方案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 与复杂的正则表达式一起使用……这要好得多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多