Regex 从导入Perl的多行文本中提取字段

Regex 从导入Perl的多行文本中提取字段,regex,postgresql,perl,Regex,Postgresql,Perl,在本例中,我想从以下类型的输入中提取一个数字7: received_tli -------------- 7 (1 row) 我已经看到了多行字符串作为Perl变量存在的情况。但是,我更喜欢这样调用表达式: psql -c "SELECT received_tli FROM pg_stat_wal_receiver" | \ perl -e 'print $1 if /<expression>/' 我已尝试将例如.\s^接收的\u tli\s*\n

在本例中,我想从以下类型的输入中提取一个数字7:

 received_tli 
--------------
            7
(1 row)
我已经看到了多行字符串作为Perl变量存在的情况。但是,我更喜欢这样调用表达式:

psql -c "SELECT received_tli FROM pg_stat_wal_receiver" | \
  perl -e 'print $1 if /<expression>/'

我已尝试将例如.\s^接收的\u tli\s*\n-+\n\s*[0-9]+\s*\n1行作为表达式,但这似乎不起作用。如何解析通过多行正则表达式传输到Perl中的多行输入?

从示例数据来看,似乎您希望整数位于仅包含该整数和一些空格的行上。所以类似这样的方法会奏效:

#!/usr/bin/perl

use strict;
use warnings;

while (<>) {
  /^\s*(\d+)\s*$/ and print $1;
}
但是,如果确实希望每次都重新键入Perl代码,可以使用:

$ psql ... | perl -n -e 'print $1 if /^\s*(\d+)\s*$/'

perl-e的问题是,您在任何时候都没有阅读标准文本,因此perl没有“看到”您的数据

您可以使用-ne,它告诉perl将代码段包装在while{}循环中。这可能是有限的用途,因为它是一行一行的工作

因此,您需要设置“行尾分隔符”-0标志,然后应用正则表达式:

perl -0777 -ne 'print $1 if m/received_tli\D*(\d+)/' 
或者用更长的perl脚本编写,但希望可读性更好:

#!/usr/bin/perl
use strict;
use warnings;

local $/;
while (<>) {
   print $1,"\n" if m/received_tli\D*(\d+)/;
}

根本不需要涉及Perl。只需在psql中使用-t或-tuples only选项:


当然,您希望打印出不是标题或行计数的每一行,并且不需要多行正则表达式,因此最好使用DBI模块在Perl中编写整个内容
#!/usr/bin/perl
use strict;
use warnings;

local $/;
while (<>) {
   print $1,"\n" if m/received_tli\D*(\d+)/;
}
psql -t -c "SELECT received_tli FROM pg_stat_wal_receiver"