我想用perl钉住螺丝,到目前为止,这是我到目前为止所要了解的。
perl -ne '/(.+)\.(.+)\((.+)\)(.+)(?{print "match" if ( $1 > 9 || ( $1 == 9 && $2 > 1 ) || ($1 == 9 && $2 == 1 && $3 > 7 ) || $1 == 9 && $2 == 1 && $3 == 7 && $4 > 22 ) })/' versions
版本:
9.1(7)23
9.1(7)22
8.1(7)22
7.2(33)24
55
如果文件中的版本大于9.1(7)23,它将打印“匹配”,这很好。
但是我希望正则表达式成功,而不仅仅是打印“ match”。如何将代码块中的内容转换为实际响应。我已经用*ACCEPT|*FAIL
尝试了很多迭代,但是到目前为止没有任何效果。
答案 0 :(得分:4)
首先,正则表达式确实成功。但是,无论条件是否成立,它都会这样做。我认为您实际上是在条件为假时要求它失败。为此,您想要
(?(?{ condition })(*ACCEPT)|(*FAIL))
或者只是
(?(?{ !condition })(*FAIL))
已修复:
perl -nle'
print "$_: match"
if /
^(.+)\.(.+)\((.+)\)(.+)\z
(?(?{
!( $1 > 9
|| $1 == 9 && $2 > 1
|| $1 == 9 && $2 == 1 && $3 > 7
|| $1 == 9 && $2 == 1 && $3 == 7 && $4 > 22
)
})(*FAIL))
/x;
' versions
更好的方法是在模式之外进行检查。
perl -nle'
print "$_: match"
if /^(.+)\.(.+)\((.+)\)(.+)\z/
&& (
$1 > 9
|| $1 == 9 && $2 > 1
|| $1 == 9 && $2 == 1 && $3 > 7
|| $1 == 9 && $2 == 1 && $3 == 7 && $4 > 22
);
' versions