【发布时间】:2013-09-18 12:09:36
【问题描述】:
我希望foo() 符合extended regex 或类似brace expansion。
基于egrep的解决方案:
foo()
{
egrep -sq "$2" <<< "$1" && echo "string '$1' matches pattern '$2'"
}
$ foo bar '.*r'
string 'bar' matches pattern '*r'
$ foo bar '.*r|.*s'
string 'bar' matches pattern '*r|*s'
但我也想要一个 100% bash 的解决方案。我的尝试:
foo()
{
[[ "$1" = $2 ]] && echo "string '$1' matches pattern '$2'"
}
基本模式没问题:
$ foo bar '*r'
string 'bar' matches pattern '*r'
但是用于检测alternation / extended pattern 的适当格式是什么?
$ foo bar '*(r|s)'
$ foo bar '*\(r|s\)'
$ foo bar '*\(r\|s\)'
$ foo bar '*\{r,s\}'
$ foo bar '*{r,s}'
此外bash manpage 说:
[[表达式]]
不对单词进行分词和路径名扩展 [[ 和 ]] 之间;波浪号扩展,参数和变量扩展, 算术扩展、命令替换、进程替换和 执行报价删除。
- 在
[[ ]]语句中使用扩展正则表达式/模式是否有技巧? - 您将如何实现这样的功能?
【问题讨论】:
-
您展示的以
*开头的示例都不是有效的正则表达式。 -
哎呀,你是对的!好点@chepner。我在想那个模式是正则表达式的一个子集!我解决了我的问题,添加了信息/教育链接。谢谢你的警惕。干杯;-)
标签: regex bash conditional-operator brace-expansion