在下面的代码中,要么设置T1要么T2必须跟在正则表达式之后,否则打印“错误”,但它不起作用。
有没有更好的方法来检查T2是否有模式<a string with underscore >:<space separated strings>;
请注意冒号和分号。
#!/bin/bash
T1="TEST"
T2="TST_1:one two three;"
if [[ -z ${T1} && ! ${T2} =~ .*":".*";" ]]; then
echo "error"
exit 1
fi
答案 0 :(得分:1)
您可以使用此正则表达式:
re='^[^:_]+_[^:_]:[^[:blank:];]+([[:blank:]]+[^[:blank:];]+)+;$'
T1="TEST"
T2="TST_1:one two three;"
if [[ -z "$T1" && ! $T2 =~ $re ]]; then
echo "error"
exit 1
fi
答案 1 :(得分:0)
这对我有用:
re="^.+_.+:.+( .+)+;$"
if [[ -z "$T1" && ! $T2 =~ $re ]]; then
echo "Error"
exit 1
fi
对于该正则表达式,插入符号(“^”)表示该行的开头。然后是“。+”,它是任何字符(句点)的1次或更多次(加号)。然后有一个下划线和另一组1个或多个字符后跟冒号。之后,您有一组1个或多个字符,后跟至少一组空格和一些字符。然后分号和一个美元符号意味着必须是行的结尾。
使用您的样本,它会按如下方式分解:
^.+ - "TST" at the beginning of the line
_ - the underscore
.+ - "1"
: - the colon
.+ - "one"
( .+)+ - inside the parentheses, there's a space and a .+
meaning one or more characters. So that's " two".
But the plus after the right parenthesis means one
or more of that group so it also applies to " three"
as well as any other groups of letters that might
follow, separated by spaces.
;$ - the trailing semicolon, at the very end of the line.
这将允许开头的任何字符集(只要有下划线),冒号和由空格分隔的任意数量的字符组。当然还有落后的分号。
顺便说一下,如果你想把东西限制在字母,数字和下划线上(这样“t#t_1:...”就会失败),请切换“\ w”的句号,这是[a-的简写ZA-Z0-9 _]。
如果你想要使用正则表达式,那么像https://www.debuggex.com/?flavor=pcre这样的调试器会很有用。
希望这有帮助!