我已经查看了一些关于此的线程,但似乎无法使其正常工作。显然我的正则表达式语句和/或 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
使用 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
TLDR:
brackets_regex='\(([^()]*)\)'
brackets_regex='\[([^][]*)]'
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 演示
输出:
entry1
entry2
entry3
entry4