多行Bash正则表达式匹配

时间:2018-07-03 13:53:41

标签: regex bash shell

我一直在阅读有关此问题的大量主题,但是还没有一个帮助我。

这是我的文字示例:

    [userId:@"1"
        userName:@""
            userPos:@[@"11006321C", ]
         userDisp:@[@"4200012FD6", ]];



[userId:@"2"
        userName:@""
            userPos:@[@"412520084C",
                     @"7200851", 
                     @"54720021", 
                     ]
        userDisp:@[@"230035FD6", 
                     @"3213456432C0035FD6", 
                     @"1F200538D5", 
                     ]];

我正试图捕捉到这一点:

userPos:@[@"11006321C", ]
         userDisp:@[@"4200012FD6", ]]

userPos:@[@"412520084C",
                     @"7200851", 
                     @"54720021", 
                     ]
        userDisp:@[@"230035FD6", 
                     @"3213456432C0035FD6", 
                     @"1F200538D5", 
                     ]]

(文本中的所有匹配项)使用正则表达式:userPos:@\[((?:.\r?\n?)*)\]

使用以下方法在bash中尝试

for string in $file # text has been read into this variable
do
    [[ $word =~ $regex ]]
    if [[ ${BASH_REMATCH[0]} ]]
    then
        string="${x:+x }${BASH_REMATCH[0]}"
        userlist+=("$string")
        echo "$string"
    fi
done

要将它们附加到列表中。

但是这不起作用,因为正则表达式完全符合注释。我知道有各种正则表达式引擎和东西,我已经尝试了许多不同的正则表达式来使其在bash中工作,但似乎无法使其正常工作。

有人可以帮助我用bash捕捉我想要的东西吗?

1 个答案:

答案 0 :(得分:0)

您要查找的正则表达式为userPos:([^;]*)]

regex="userPos:([^;]*)]"
while [[ $text =~ $regex ]]
do
    string="${x:+x }${BASH_REMATCH[0]}"
    userlist+=("$string")
    echo "$string"
    text=${text#*"${BASH_REMATCH[0]}"}
done

$text是您的文字。