假设我有这样一个文件:
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.*)/'