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 --")