我正在编写bash函数以使用正则表达式处理字符串操作。Bash内置功能在工作中非常差,我正在使用perl命令来完成它。
例如,这是我的“ strMatch”函数(以bash表示):
# Usage: if (strMatch <string> <regex>); then...
function strMatch {
local str="$1"
local regex="$2"
local perlCmd='if (qq('$str') =~ m/'$regex'/g) { print "0"; } else { print "1"; }'
return $(perl -e "$perlCmd")
}
测试字符串:foo-bar\rLoading... xx%\rFile: "some-(filename.ext".
regex:-bar(?:.*?)File: "(.\*?)\.ext"
除了一件事外,一切都正常; 我找不到一种方法来适当地转义字符串中的特殊字符以进行匹配(至少对于其中一些字符)。
我是Perl的新手(除了regex语法),所以我尝试了到处都是的各种尝试,但都没有成功。
如果使用'qq',则不会处理'(',这被解释为没有匹配的')'的捕获组。我猜想
-e第1行的'['... =>语法错误,“ qq(foo-bar \ rLoading ... xx%\ rFile:” some-(filename.ext“ 。)=〜m / -bar \ r(?:。*?)文件:“(。*?)\。ext” / g){“
=>在EOF之前的任何位置都找不到字符串终止符”)“- e行1。
使用'quotemeta'会更糟,在':','%','\ r'处中断...几乎所有内容
=>在-e第1行的“ bar \”附近找到了期望的反斜杠
=>运算符或分号在%之前缺失
作为奖励,如果我添加'w'或'W'选项以获得perl警告,它不会输出任何内容!!!这是怎么回事?
我只希望字符串能够包含几乎所有内容,包括'%','((','[','\ r','\ n'......有人知道该怎么做吗?做错了吗?
编辑:回答
谢谢choroba,使用perl参数$ ARGV就像一个魅力。我还使用了更优雅的ikegami解决方案的修改版本。
现在的功能如下:
# Usage: if (strMatch <string> <regex>); then...
function strMatch {
local str="$1"
local regex="$2"
local perlCmd='exit 1 if ($ARGV[0] !~ m/$ARGV[1]/g)'
perl -e "$perlCmd" "--" "$str" "$regex"
return $?
}
Edit2:添加了“-”以停止处理选项。
将字符串和正则表达式作为参数传递(我也简化了Perl代码):
#!/bin/bash
# Usage: if (strMatch <string> <regex>); then...
function strMatch () {
local str="$1"
local regex="$2"
local perlCmd='print $ARGV[0] =~ m/$ARGV[1]/ ? 0 : 1'
return $(perl -e "$perlCmd" "--" "$str" "$regex")
}
经过测试
~/test.sh $'foo-bar\rLoading... xx%\rFile: "some-(filename.ext"' '-bar(?:.*?)File: "(.*?).ext"'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句