【发布时间】:2017-04-29 19:22:59
【问题描述】:
我有一个正则表达式模式,它应该在字符串中的多个位置匹配。我想将所有匹配组放入一个数组中,然后打印每个元素。
所以,我一直在尝试这个:
#!/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
... 有什么想法吗?
【问题讨论】:
-
一个想法是使用
[^\\s]+?而不是.+?。如果找到空格,它将匹配字符直到出现空格。 -
两者都产生与我在问题中已经提到的
[^\\s]+相同的结果。我认为 bash 甚至不支持?,我的意思是在这种情况下.. 我的意思是+后面的?通常意味着match ungreedy。 -
基于此answer
POSIX regular expression(与=~运算符一起使用)没有非贪婪量词。 -
@ThomasAyoub:感谢您的指出。 @Forivin:
[^\s]与\S相同。如果需要,使用 `\` 进行转义。 -
你应该先用换行符分割字符串,然后用你的正则表达式迭代检查每个块并使用
${BASH_REMATCH[1]}获取值。
标签: regex bash regex-greedy