Regex 如何使用正则表达式在Bash中查找递归子字符串?

Regex 如何使用正则表达式在Bash中查找递归子字符串?,regex,linux,bash,shell,Regex,Linux,Bash,Shell,我的绳子看起来像 str1="The ID of ABC=98766 --,the ID of BCD=12345 --, the ID of XYZ=72819 --" 寻找子串的方法 re='(^|ID)([^---])(.*)' remaining=$str1 while [[ $remaining =~ $re ]]; do ... done 预期产量 ID of ABC=98766 -- ID of BCD=12345 -- ID of XYZ=72819 -- 我正在使用正则

我的绳子看起来像

str1="The ID of ABC=98766 --,the ID of BCD=12345 --, the ID of XYZ=72819 --"
寻找子串的方法

re='(^|ID)([^---])(.*)'
remaining=$str1
while [[ $remaining =~ $re ]];
do
...

done
预期产量

ID of ABC=98766 --
ID of BCD=12345 --
ID of XYZ=72819 --

我正在使用正则表达式,但无法使用
grep
找到Posix字符类的正确组合。您可以使用:

grep -Po '\bID .*? --' <<< "$str1"
正则表达式详细信息:

  • \b
    :单词边界
  • ID
    :匹配文本
    ID
  • *?
    后跟0个或多个字符中的0个或多个
  • --
    :匹配
    “--”
要填充数组,请执行以下操作:

readarray -t arr < <(grep -Po '\bID .*? --' <<< "$str1")

如果我们需要将每一行存储在数组中,那么我如何帮助您编写
它不起作用
?到底是什么不起作用?它只在arr[0]中存储完整的字符串str1,a[1],a[2]为空。我已经更新了答案,还添加了一个工作代码演示链接。默认情况下,RE是贪婪的-查找行中的最大匹配项。它可以被认为是不贪婪的。在简单的情况下,我会像你尝试的那样使用消极规则,但有时这是不可能的。我有一种感觉,那就是“*?”,但你需要仔细阅读非贪婪匹配:-)你的短语
[^-]
并不像你想象的那样。它说“匹配任何不在”
-
-
-
之间的内容”,或者它的意思是“匹配任何不在”
-
-
之间的内容”,这两种方式都是一个非常奇怪的请求!Bash正则表达式匹配(
=~
)总是贪婪的,但有时可以使用一些技巧来限制它。但不存在非贪婪运算符或修饰符。
readarray -t arr < <(grep -Po '\bID .*? --' <<< "$str1")
declare -p arr
declare -a arr=([0]="ID of ABC=98766 --" [1]="ID of BCD=12345 --" [2]="ID of XYZ=72819 --")