双括号版测试中的正则表达式边界

时间:2014-06-20 15:40:05

标签: regex bash shell

似乎我无法在[[中使用字边界:

$ echo foo | md5sum
d3b07384d113edec49eaa6238ad5ff00  -
$ [[ "$(echo foo | md5sum)" =~ ^d3b07384d113edec49eaa6238ad5ff00 ]] && echo ok
ok
$ [[ "$(echo foo | md5sum)" =~ ^d3b07384d113edec49eaa6238ad5ff00\b ]] && echo ok
$  ## no output 

[[中是否接受字边界?或者我错过了什么?

2 个答案:

答案 0 :(得分:1)

这似乎有效,虽然它有点冗长:

[[ "$(echo foo | md5sum)" =~ $(echo '^d3b07384d113edec49eaa6238ad5ff00\b') ]] && echo ok

答案 1 :(得分:1)

问题似乎与反斜杠在shell解释时失去意图有关。可能有一些引用的咒语会消除这个问题,但对我而言,有时只是将构造的输出转储到Perl中以便进一步处理。

如果您可以接受在您的系统上调用Perl的解决方案,则可以使用:

echo foo | md5sum | perl -nE 'say "ok" if m/^\bd3b07384d113edec49eaa6238ad5ff00\b/'

如果您坚持使用早于v5.10的Perl,那么:

echo foo | md5sum | perl -lne 'print "ok" if m/^\bd3b07384d113edec49eaa6238ad5ff00\b/'

如果您通读perlrun,解决方案是相当不言自明的,它解释了各种命令行开关的作用。我们正在使用-n使Perl处理一些输入,-E告诉Perl使用现代(5.10+)功能(say)评估一些代码,其余只是读出你想象的。

对于较旧的Perl版本(5.10之前版本),say无法使用,因此命令行切换为-l-n和 - {{1} }:第一个从输入中删除换行符(不是很有用),并将它们添加到输出中(有用,因为e不会这样做,而较新的print会这样做。而say使用5.10之前的语义来评估一些代码。