Multiline Bash Regex Match - PullRequest
       9

Multiline Bash Regex Match

0 голосов
/ 03 июля 2018

Я читал об этом множество тем, но ни одна из них мне еще не помогла.

Это образец моего текста:

    [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

Чтобы добавить их в список.

Но это не работает, так как регулярное выражение совпадает, отмечая вообще. Я знаю, что существуют различные виды движков Regex и тому подобное, и я пробовал так много разных регулярных выражений, чтобы это работало в bash, но, похоже, не могу заставить его работать.

Кто-нибудь, кто может помочь мне поймать то, что я хочу в bash?

1 Ответ

0 голосов
/ 03 июля 2018

Регулярное выражение, которое вы ищете: userPos:([^;]*)].

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

$text это ваш текст.

...