正则表达式在括号之间提取值

时间:2016-01-28 11:40:11

标签: regex bash

我已经看了几个关于此问题的线索,但似乎无法让它发挥作用。显然我的正则表达式语句和/或bash_rematch存在问题。

最多只有4 x()'

拥有以下bash脚本:

#!/bin/bash
brackets_regex="\((.*?)\)"
text="random date (entry1) some more random data (entry2) random (entry3) random data (entry4)"

if  [[ $text =~ $brackets_regex ]]; then
    echo ${BASH_REMATCH[0]};
    echo ${BASH_REMATCH[1]};
    echo ${BASH_REMATCH[2]};
    echo ${BASH_REMATCH[3]};
fi

预期输出应为:

entry1
entry2
entry3
entry4

当前输出:

(entry1) some more random data (entry2) random (entry3) random data (entry4)
entry1) some more random data (entry2) random (entry3) random data (entry4

2 个答案:

答案 0 :(得分:2)

使用gnu grep:

grep -oP '\(\K[^)]*' <<< "$text"
entry1
entry2
entry3
entry4

使用gnu-awk:

text="random date (entry1) some more random data (entry2) random (entry3) random data (entry4)"
awk -v FPAT='\\([^)]*\\)' '{for(i=1; i<=NF; i++) {gsub(/[()]/, "", $i); print $i}}' <<< "$text"
entry1
entry2
entry3
entry4

答案 1 :(得分:0)

Bash正则表达式不支持延迟量词。您需要依赖与[^()](匹配任何字符的否定字符类)

以下是实现所需目标的另一种方式:

#!/bin/bash
text="random date (entry1) some more random data (entry2) random (entry3) random data (entry4)"
brackets_regex="\(([^()]*)\)"
for s in ${text[@]}; do
    if [[ ${s} =~ $brackets_regex ]]; then
        echo ${BASH_REMATCH[1]};
    fi
done

请参阅IDEONE demo

输出:

entry1
entry2
entry3
entry4