【问题标题】:Reverse regex pattern match - how to tell which pattern matched a result (Bash)反向正则表达式模式匹配 - 如何判断哪个模式匹配结果(Bash)
【发布时间】:2021-03-10 16:29:30
【问题描述】:

我有一个简单的函数来查找用 Bash 编写的跟踪号,该函数有效。我为每个模式变化定义了几个变量。然后我使用egrep 搜索文件,然后输出匹配。我想做的是知道哪个模式匹配,以便我可以将其识别为输出的一部分。

function gettracking () {

local usps1='[0-9]{20}'
local usps2='[0-9]{4}[[:blank:]][0-9]{4}[[:blank:]]'
# there's several more, but not necessary for the question)

tracking=$(egrep "${usps1}|${usps2}" $1)

if [ -z "${tracking}-x" ]
then
  echo "No tracking found"
else 
  echo "Tracking # ${tracking} sent to clipboard"
  echo ${tracking} | pbcopy    # (this is on macOS BTW)
fi
}

我想知道哪些变量($usps1$usps2 等)提供了匹配,以便我可以让我的输出显示为 The USPS Tracking # is...The FedEx Tracking # is...

有没有办法确定匹配的模式?

【问题讨论】:

  • 使用grep -o 得到匹配的部分,然后您可以在case 语句中对其进行测试以查看它匹配的模式。
  • if [ -z "${tracking}+x" ] 永远不会是真的。
  • 你能给我一个grep -o的例子吗?我看到了输出,但是如何将它与模式匹配?我不需要一个完整的冗长 case 语句......只需条件的语法/示例就足够了

标签: bash variables grep


【解决方案1】:

使用grep -o 获取文件的匹配部分,然后使用每个模式对其进行测试。

match=$(grep -o "${usps1}|${usps2}" $1)
if [[ $match =~ $usps1 ]]
then echo "The USPS tracking number is $tracking"
elif [[ $match =~ $usps2 ]]
then echo "The FedEx tracking number is $tracking"
fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2023-04-04
    相关资源
    最近更新 更多