当前位置: 首页 > 知识库问答 >
问题:

如何在Bash中将字符串与正则表达式匹配?

秦飞航
2023-03-14

我正在尝试编写一个bash脚本,其中包含一个函数,因此当给定一个时。tar。焦油bz2。焦油gzetc.文件它使用带有相关开关的tar来解压缩文件。

我使用if-elif-then语句来测试文件名的结尾,但我无法使用regex元字符使其匹配。

为了节省不断重写脚本,我在命令行中使用“test”,我认为下面的语句应该可以工作,我已经尝试了括号、引号和元字符的每一个组合,但仍然失败。

test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)

我相信问题很简单,我到处都找过了,但我不知道怎么做。有人知道我怎么做吗?

共有3个答案

通学真
2023-03-14

我没有足够的代表在这里发表评论,所以我提交了一个新的答案来改进dogbane的答案。regexp中的点。

[[sed-4.2.2.tar.bz2=~tar.bz2$]

将实际匹配任何字符,而不仅仅是“tar”之间的文字点。比如bz2'

[[ sed-4.2.2.tar4bz2 =~ tar.bz2$ ]] && echo matched
[[ sed-4.2.2.tar§bz2 =~ tar.bz2$ ]] && echo matched

或者任何不需要用“\”转义的东西。严格的语法应该是

[[ sed-4.2.2.tar.bz2 =~ tar\.bz2$ ]] && echo matched

或者你可以去更严格,也包括在正则表达式中的前一个点:

[[ sed-4.2.2.tar.bz2 =~ \.tar\.bz2$ ]] && echo matched

蒲寂离
2023-03-14
extract () {
  if [ -f $1 ] ; then
      case $1 in
          *.tar.bz2)   tar xvjf $1    ;;
          *.tar.gz)    tar xvzf $1    ;;
          *.bz2)       bunzip2 $1     ;;
          *.rar)       rar x $1       ;;
          *.gz)        gunzip $1      ;;
          *.tar)       tar xvf $1     ;;
          *.tbz2)      tar xvjf $1    ;;
          *.tgz)       tar xvzf $1    ;;
          *.zip)       unzip $1       ;;
          *.Z)         uncompress $1  ;;
          *.7z)        7z x $1        ;;
          *)           echo "don't know '$1'..." ;;
      esac
  else
      echo "'$1' is not a valid file!"
  fi
}

为了回应上面评论中的宝瓶座能量,我们需要将正则表达式存储在var上

变量BASH_REMATCH在您匹配表达式后设置,${BASH_REMATCH[n]}将匹配以下${BASH_REMATCH[1]}="压缩"${BASH_REMATCH[2]} = ".gz"中括号中的第n组

if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]]; 
then 
  echo ${BASH_REMATCH[2]} ; 
else 
  echo "Not proper format"; 
fi

(上面的正则表达式并不适用于文件命名和扩展名,但它适用于示例)

萧星火
2023-03-14

要匹配正则表达式,您需要使用=~运算符。

试试这个:

[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched

或者,您可以使用通配符(而不是正则表达式)和=运算符:

[[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched

如果可移植性不是一个问题,我建议使用[而不是[test,因为它更安全、更强大。有关详细信息,请参阅test、[和[[?之间的区别。

 类似资料:
  • 问题内容: 我有一个输入字符串。 我正在考虑如何有效地将此字符串与多个正则表达式匹配。 我想针对这些正则表达式模式进行匹配,如果其中至少一种匹配则返回: 我不确定如何一次匹配多种模式。有人可以告诉我我们如何有效地做到这一点吗? 问题答案: 如果只有几个正则表达式,并且在编译时都知道它们,那么这就足够了: 如果它们更多,或者它们在运行时加载,则使用模式列表:

  • 问题内容: 如何检查整个字符串是否可以与正则表达式匹配?在Java中是方法 问题答案: 您需要结合使用锚(字符串锚的开始)和字符串锚的结束,并通过以下选项进行操作: 或者,您可以传递一个选项数组,其中仅将模式锚定在字符串的开头,您可以省略,但仍然需要锚定在字符串末尾: 观看在线Swift演示 另外,在此处使用with 是一种替代方法: 根据ICU v3,使用正则表达式样式的比较,左手表达式等于右手

  • 问题内容: 我在尝试将我的javascript regex经验转移到Python时遇到了麻烦。 我只是想让它工作: …但是它打印无。如果我做: 它匹配…默认情况下是否匹配字符串的开头?当匹配时,如何使用结果? 我如何进行第一场比赛?是否有比python网站提供的文档更好的文档? 问题答案: 隐式添加到您的正则表达式的开头。换句话说,它仅在字符串的开头匹配。 将在所有位置重试。 一般来说,建议您在需

  • 问题内容: 我在用Python将字符串中的数字匹配时遇到麻烦。尽管应该明确匹配,但甚至不匹配 或仅匹配。我的监督在哪里? 问题答案: 阅读文档:http : //docs.python.org/2/library/re.html#re.match 如果在零个或多个字符 开头 的 字符串 您要使用(或)

  • 问题内容: 在Swift中,查看字符串是否与模式匹配的简单方法是什么? 伪代码示例: (我已阅读斯威夫特文档并没有看到一个正则表达式的能力。我读过有关增加一个新的运营商是一个好主意,但不是我想,因为这是一个教学项目。我已经尝试了更复杂的,但收到错误:“字符串”没有成员“ rangeOfString”。我正在寻找一种Swift解决方案,即未键入NSRegularExpression。我不需要对匹配结

  • 字符串可以说是程序设计中最为重要的数据类型之一。几乎每种高级编程语言都有它的一席之地,而且能有效的使用它也是开发者编写实用程序的基本准则。作为重要的扩展,正则表达式赋予开发者操作字符串的额外能力。ECMAScript 6 的缔造者们将这些事实牢记于心,改进了字符串和正则表达式,并添加了长久以来缺失的某些功能。本章会讲解它们的变化之处。 译者注: gitbook 无法正常解析 $$ 字符,所以在模板