bash 运算符=~
相当于perl
调用吗?
filename="test-33.csv"
regex="([^.]+)(-\d{1,5})(\.csv)"
通过 bash 测试:
if [[ "$filename" =~ $regex ]]; then echo "it matches"; else echo "doesn't match"; fi
# doesn't match
if [[ "$filename" =~ ([^.]+)(-\d{1,5})(\.csv) ]]; then echo "matches"; else echo "doesn't match"; fi
# doesn't match
和perl
:
result="$(perl -e "if ('$filename' =~ /$regex/) { exit 0;} else { exit 1;} ")"
if [[ result ]]; then echo "it matches"; else echo "doesn't match"; fi
# it matches
我对 bash 操作符有什么遗漏吗=~
?这与贪婪与非贪婪迭代器 ( ) 有关系吗[^.]+
?
有几种不同类型的正则表达式,每种类型都添加更多运算符(因此如果要将它们视为文字,则需要转义更多字符)。
操作
=~
员在文档中进行了描述(请参阅man bash
您的系统或在线),如下所示,grep -E
扩展正则表达式 (ERE) 可以与(以前的)匹配egrep
。您的示例是 Perl 兼容正则表达式 (PCRE),它是 ERE 的超集,不能与=~
. 但是,可以通过替换为进行简单\d
调整[[:digit:]]
:因此,鉴于这
grep -E
相当于=~
我们可以这样写,请注意,您的 ERE 可能应该以 为前缀
^
和后缀$
,并[^.]+
调整为[^-.]+
以确保您无法匹配诸如 之类的字符串abc-def-12345678-123.csv.txt
:如果您绝对决定使用 PCRE 而不是 ERE,则必须使用外部工具(例如 GNU 实现)
grep
来执行匹配。但这效率较低,并且与上面给出的有关边界的相同建议也适用于此处:基本 RE(RE 或 BRE)和 ERE 的 POSIX 参考位于https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html,Perl RE (PCRE) 的参考位于https:// www.pcre.org/original/doc/html/pcrepattern.html。请注意,这两种文档都不是最容易理解的。
最后你问,
这不是贪婪/非贪婪迭代器。
[^.]+
是贪婪的,意味着“除了点 (.
)之外的一个或多个”。ERE 没有非贪婪运算符。PCRE 可以定义非贪婪运算符,例如*
或+
通过在其后面添加?
。例如对比度a*
和a*?
;第一个将匹配a
尽可能多的字符,第二个将匹配尽可能少的字符。括号
( … )
是分组,而不是贪婪指标。运算符
=~
inBash shell
相当于grep -E
GNU 命令。Perl
正则表达式不被它识别。你需要做类似的事情:拥有同等的。
关于
grep
使用的选项:使用您的原始形式,这看起来像:
这也有效:
您还可以执行以下操作:
Bash扩展了 glob 模式,更接近正则表达式。
[[...]]
在运算符内==
进行全局样式模式匹配。如果您使用正则表达式来过滤文件名列表,请在 for 循环中使用 glob 模式。
笔记
shopt
:扩展的 glob 会在其中自动启用[[...]]
,但在其他情况下不会自动启用。$pattern
在这些代码片段中特别未加引号,以便将其作为模式而不是文字字符串进行处理。