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

问题描述 投票:0回答:2

我已经查看了一些关于此的线程,但似乎无法使其正常工作。显然我的正则表达式语句和/或 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
regex bash
2个回答
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

0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.