bash正则表达式解析表单+ incdir + <dir1> + <dir2> </dir2> </dir1>的文本

时间:2014-05-17 18:27:01

标签: regex bash

我有一个+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,然后匹配我至少一个以+开头的组,后跟尽可能多的字符匹配+。点击+时,这是下一组的开始。我想我的推理是不正确的。

有谁知道我做错了什么?

1 个答案:

答案 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