使用match仅在bash中查找string中的子string

虽然我几乎可以肯定这已经被覆盖了,但我似乎无法find任何具体的东西。 当我继续我的学习bash的旅程时,我总是发现我困惑的部分,为什么事情会以他们的方式发生。

在string中search和replace或仅匹配子string很可能是您在编写脚本时首先要做的事情之一。 但是,试图坚持一种语言或一套工具是很难做到的,因为你可以用多种方式解决大多数问题。 我尽我所能保持尽可能低的水平与bash。 我遇到了一个麻烦,我需要有人向我解释。

在匹配的bash中使用子string进行search会给我不同的结果,这取决于我使用的正则expression式,而我不知道为什么。

#!/bin/bash Stext="Hallo World" echo `expr "$Stext" : '^\(.[az]*\)'` # Hallo echo `expr "$Stext" : '.*World'` # 11 

虽然两个人都search了一个词,但我想这两个词都不会返回他们发现的东西。 为什么?

两个expression式都是等价的,不同的是你使用的正则expression式:

 $ echo `expr "$Stext" : '^\(.[az]*\)'` Hallo $ echo `expr "$Stext" : '^.[az]*'` 5 $ echo `expr "$Stext" : '\(.*World\)'` Hallo World $ echo `expr "$Stext" : '.*World'` 11 

正如你所看到的,括号是什么使得不同的是返回匹配的长度或匹配本身。

您可以在“高级Bash脚本指南”的第10章中find更多示例。

您可以在bash使用BASH_REMATCHvariables来获取匹配的string:

 $ Stext="Hallo World" $ [[ $Stext =~ ^.[az]* ]] && echo $BASH_REMATCH Hallo $ [[ $Stext =~ ^(.[az]*) ]] && echo ${BASH_REMATCH[1]} Hallo 

在正则expression式中由子句expression式匹配的子string保存在数组variablesBASH_REMATCH中 。 索引为0的BASH_REMATCH元素是匹配整个正则expression式的string部分。 索引为n的BASH_REMATCH的元素是匹配第n个加括号的子expression式的string部分。

我做了这个简单的function:

 match() { TRUE=1 FALSE=0 match_return=0 echo $1 | grep $2 >/dev/null [ $? -eq 0 ] && match_return=$TRUE || match_return=$FALSE } 

用法:

 match Testing Test ; [ $match_return -eq 1 ] && echo "match!" || echo "nope" 

整个代码: https : //gist.github.com/TeeBSD/5121b3711fad40a09455

对于快速的stringsearch…一个选项是grep。
如果没有find,则返回空,否则匹配:

 found=`echo $big | grep -e $short` if [ ! -z $found ]; then echo 'There is a match'; else echo 'No no'; fi