我已经看了几个关于此问题的线索,但似乎无法让它发挥作用。显然我的正则表达式语句和/或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
答案 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