bash点。在[]

时间:2019-06-04 15:49:20

标签: regex bash

我希望能够使用名称与特定正则表达式匹配的方式从目录快速转到其祖先之一。我发现可以使用expr match选择pwd的特定部分,然后选择内部的cd。然后,我将在.bashrc中添加一个简单的脚本作为别名,并称之为一天。 基本上,我不得不从.../WoRd*/之类的东西中选择/some/directory/path/WoRd.to-match_x/hello/world/

所以我写了一个正则表达式来做它-'\(.*/[wW][oO][rR][dD][a-zA-Z0-9_-.]*/\)'-但是没用。它选择整个字符串而不是带有“ ... / WorD /”的部分。

$ str="/some/directory/path/WoRd.to-match_x/hello/world/"
$ echo "match: " $(expr match "$str" '\(.*/[wW][oO][rR][dD][a-zA-Z0-9_-.]*/\)');
match:  /some/directory/path/WoRd.to-match_x/hello/world/

然后我尝试掩盖一个点,但没有帮助:

$ echo "match: " $(expr match "$str" '\(.*/[wW][oO][rR][dD][a-zA-Z0-9_-\.]*/\)');
match:  /some/directory/path/WoRd.to-match_x/hello/world/

一个小时左右的谷歌搜索和阅读正则表达式手册无济于事。

我实际上设法通过将点向左移动来使此功能正常工作

$ echo "match: " $(expr match "$str" '\(.*/[wW][oO][rR][dD][a-zA-Z0-9_.-]*/\)');
match:  /some/directory/path/WoRd.to-match_x/

我的bash版本是:GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

点不是问题。括号表达式内的所有字符均按字面意义处理... -除外。

您的后3个字符_-.定义了一个范围,该范围由(按ASCII顺序)由_开始并以.结尾的字符组成。由于_是ASCII 95,而.是ASCII 46,因此该范围为空,因此您的正则表达式等效于'\(.*/[wW][oO][rR][dD][a-zA-Z0-9]*/\)'

.向左移动时,-成为括号表达式中的最后一个字符,因此现在按字面意义而不是范围定义的一部分来对待它,因此{{1 }},._被包含在方括号表达式中。

顺便说一句,-中的正则表达式匹配不需要使用expr

bash