perl存储和打印带空格的grep输出

hmae6n7t  于 2023-03-03  发布在  Perl
关注(0)|答案(1)|浏览(201)

使用空格存储grep输出。我想将grep命令的输出(使用空格)存储到变量或数组中,并使用空格将其打印出来。
文件包含:

### Invoked at: Wed Dec  7 22:24:35 2022 ###

代码:

my $date = qx(grep -oP "\bInvoked at: \\K[^#]*\d" $file);
print "Date: $date\n";

预期产出:

Date: Invoked at: Wed Dec  7 22:24:35 2022
hec6srdp

hec6srdp1#

\b\d应该是\\b\\dqx文本与qq文本类似,因此需要对\$@进行转义。
并且应该去掉print语句中的\n,因为$date中的字符串已经有一个,或者使用chomp( $date );删除$date中的一个。
您在$file的插值中还有一个代码注入错误,可以使用String::ShellQuote的shell_quote解决。

use String::ShellQuote qw( shell_quote );

my @cmd = ( "grep", "-oP", '\bInvoked at: \K[^#]*\d', $file_qfn );
my $cmd = shell_quote( @cmd );

my $date = qx($cmd);
die "Can't spawn shell: $!\n" if $? == -1;
die "Shell killed by signal ".( $? & 0x7F )."\n" ) if $? & 0x7F;
die "Shell exited with error ".( $? >> 8 )."\n" ) if $? >> 8;

chomp( $date );

say $date;

更好的是,我们可以避免shell,并且避免构建shell命令。

use IPC::System::Simple qw( capturex );

my @cmd = ( "grep", "-oP", '\bInvoked at: \K[^#]*\d', $file_qfn );

my $date = capturex( @cmd );
chomp( $date );

say $date;

为什么要运行一个子进程呢?

use File::Slurper qw( read_text );

my $file = read_text( $file_qfn );

my ( $date ) = $file =~ /\bInvoked at: ([^#]*\d)/
   or die( "Invocation date not found\n" );

say $date;

相关问题