我们拥有什么:
在previous question中,建议使用以下模式识别与bash中的模式匹配的行,并将该行的部分提取到shell变量中:
re='^\[([[:digit:]:]+)\] \[Server thread/INFO\]: ([^[:space:]]+) entered area ~ ([^[:space:]]+) - [(]PvP[)] ~'
line='[18:51:10] [Server thread/INFO]: Tester121 entered area ~ Wilderness - (PvP) ~'
if [[ $line =~ $re ]]; then
time=${BASH_REMATCH[1]}
player=${BASH_REMATCH[2]}
area=${BASH_REMATCH[3]}
fi
但是,如果匹配的内容可以包含空格,则该代码不起作用。请考虑以下简化格式:
re='???'
line='[19:27:14] [Server thread/INFO]: Tester121 entered area ~ City - Leader Tester777 - (No PvP) ~'
if [[ $line =~ $re ]]; then
time=${BASH_REMATCH[1]}
player=${BASH_REMATCH[2]}
area=${BASH_REMATCH[3]}
#leader="Tester777"
leader=${BASH_REMATCH[4]}
#pvp="No PvP"
pvp=${BASH_REMATCH[5]}
fi
re
应该是什么?我是正则表达式的新手并尝试学习。
答案 0 :(得分:2)
由于你提到“改变”,我假设你不应该同时匹配两种情况。如果我错了,请纠正我。
那么如下:
\[([[:digit:]:]+)\] \[Server thread/INFO\]: ([^[:space:]]+) entered area ~ ([^[:space:]]+) - Leader ([^[:space:]]+) - \(([^)]*)\) ~
您可以看到live preview here。
中有空格
这里的关键是\(([^)]*)\)
。它匹配括号内的所有内容。这当然意味着你不能拥有嵌套(近似)括号。