我看到有关正则表达式的所有信息但未能找到我的问题的解决方案。我希望以前没有涉及到这一点。像往常一样,我对获得解决方案并不感兴趣,而是理解为什么它以它的方式工作。只有这样,我才能学习bash及其复杂性。
我的例子:
#!/bin/bash
Stext="Hallo World"
re="(.[a-z]*)$"
[[ $Stext =~ $re ]]
DBTable=${BASH_REMATCH[1]}
echo $DBTable
DBTable=`expr "$Stext" : $re`
echo $DBTable
你们大多数人都可以猜到,我没有两次打印 世界 ,我不知道为什么。
到目前为止,我已经设法从expr版本中获得一些响应,将表达式转义为:
DBTable=`expr "$Stext" : '\(.[a-z]*\)$'`
这仍然不会产生预期的结果。
有人可以给我一些见解。
答案 0 :(得分:3)
expr
将正则表达式视为隐含地锚定在字符串的开头 - 也就是说,它隐式添加了^
- 因此您需要在感兴趣的点之前提供所有内容。此外,正如您所注意到的,您需要编写\(
和\)
而不是(
和)
,因为expr
使用基本正则表达式(BRE) ,而不是扩展正则表达式(ERE)。所以,这个:
expr 'Hallo World' : '.[a-z]* \(.[a-z]*\)$'
将打印World
。