我有一个+incdir+<dir1>+<dir2>
形式的输入字符串,其中<dir1>
和<dir2>
是目录名称。我想使用bash正则表达式解析它,并在BASH_REMATCH [1],[2],...中包含目录的值...
以下是我的尝试:
function match {
if [[ "$1" =~ \+incdir(\+.*)+ ]]; then
for i in $(seq $(expr ${#BASH_REMATCH[@]} - 1)); do
echo $i ":" ${BASH_REMATCH[$i]}
done
else
echo "no match"
fi
}
这适用于match +incdir+foo
,但不适用于match +incdir+foo+bar
,因为它会进行贪婪匹配并输出+foo+bar
。由于regex in bash expression提及bash中没有任何非贪婪匹配,所以我尝试了以下模式:\+incdir(\+[^+]*)+
但这只是给了我+bar
。
我解释正则表达式的方法如下:找到开始+incdir
,然后匹配我至少一个以+
开头的组,后跟尽可能多的字符匹配+
。点击+
时,这是下一组的开始。我想我的推理是不正确的。
有谁知道我做错了什么?
答案 0 :(得分:2)
仅使用bash builtins(但不是正则表达式,这是此作业的错误工具):
match() {
[[ $1 = *+incdir+* ]] || return # noop if no +incdir present
IFS=+ read -r -a pieces <<<"${1#*+incdir+}" # read everything after +incdir+
# into +-separated array
for idx in "${!pieces[@]}"; do # iterate over keys in array
echo "$idx: ${pieces[$idx]}" # ...and emit key/value pairs
done
}
$ match "yadda yadda +incdir+foo+bar+baz"
0: foo
1: bar
2: baz