Perl grep-like一行与regex匹配条件和分配?



假设我有这样一个文件:

cat > testfile.txt <<'EOF'
test1line
test23line
test456line
EOF

现在,我想在"grep中使用perl。方式(带有file参数的单行表达式/命令,它将输出转储到terminal/stdout),这样我就匹配了上述行中的所有数字,并将它们转换为补零的三位数表示。所以,我试着检查匹配是否正常工作:

perl -nE '/(.*test)(d+)(line.*)/ && print "$1 - $2 -$3n";' testfile.txt
#test - 1 -line
#test - 23 -line
#test - 456 -line

好吧,这是可行的;所以现在,我在想,我就调用sprintf来格式化,把它赋值给一个变量,然后打印这个变量,就完成了;不幸的是,我的尝试失败了:

perl -nE '/(.*test)(d+)(line.*)/ && $b = sprintf("%03d", $2); print "$1 - $b -$3n";' testfile.txt
#Can't modify logical and (&&) in scalar assignment at -e line 1, near ");"
#Can't modify pattern match (m//) in scalar assignment at -e line 1, near ");"
#Execution of -e aborted due to compilation errors.

好的,这里出了问题。据我所知,从错误消息中可以看出,显然混合逻辑与(&&)和上面一行中的赋值不起作用。

那么,我怎么能有一个Perl单行程序检查一个正则表达式条件;如果检测到匹配,则执行一系列命令,这些命令可能涉及一个或多个赋值,并以print?

结尾。

编辑:找到一个有效的调用:

perl -nE '/(.*test)(d+)(line.*)/ && printf("$1%03d$3n", $2);' testfile.txt
#test001line
#test023line
#test456line

…但是我仍然想知道如何通过sprintf和分配给变量来做同样的事情。

优先级问题

/.../ && $b = ...;

( /.../ && $b ) = ...;

你可以用

/.../ && ( $b = ... );
/.../ && do { $b = ...; };
/.../ and $b = ...;
$b = ... if /.../;

但是还有第二个问题。无条件调用print

perl -ne'printf "%s-%03d-%sn", $1, $2, $3 if /(.*test)(d+)(line.*)/'

最新更新