gpt4 book ai didi

regex - Bash 正则表达式非贪婪匹配

转载 作者:行者123 更新时间:2023-11-29 08:57:45 25 4
gpt4 key购买 nike

我有一个正则表达式模式,它应该匹配字符串中的多个位置。我想将所有匹配组放入一个数组中,然后打印每个元素。

所以,我一直在尝试这个:

#!/bin/bash

f=$'\n\tShare1 Disk\n\tShare2 Disk\n\tPrnt1 Printer'
regex=$'\n\t(.+?)\\s+Disk'
if [[ $f =~ $regex ]]
then
for match in "${BASH_REMATCH[@]}"
do
echo "New match: $match"
done
else
echo "No matches"
fi

结果:

New match: 
Share1 Disk
Share2 Disk
New match: Share1 Disk
Share2

预期的结果是

New match: Share1
New match: Share2

我认为它不起作用,因为我的 .+? 匹配贪婪。所以我查看了如何使用 bash 正则表达式来完成。但是每个人似乎都建议将 grep 与 perl 正则表达式一起使用。

但肯定还有另一种方法。我在想可能是 [^\\s]+.. 但输出是:

New match: 
Share1 Disk
New match: Share1

...有什么想法吗?

最佳答案

这里有几个问题。首先,BASH_REMATCH 的第一个元素是匹配模式的整个字符串,而不是捕获组,因此您要使用 ${BASH_REMATCH[@]:1} 来获取捕获组中的那些东西。

但是,bash 正则表达式不支持在字符串中多次重复匹配项,因此 bash 可能不是这项工作的正确工具。由于事情是在他们自己的行上,你可以尝试使用它来拆分事情并将模式应用于每一行,如:

f=$'\n\tShare1   Disk\n\tShare2  Disk\n\tPrnt1  Printer'
regex=$'\t(\S+?)\\s+Disk'
while IFS=$'\n' read -r line; do
if [[ $line =~ $regex ]]
then
printf 'New match: %s\n' "${BASH_REMATCH[@]:1}"
else
echo "No matches"
fi
done <<<"$f"

关于regex - Bash 正则表达式非贪婪匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41143014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com