Regex 从导入Perl的多行文本中提取字段
在本例中,我想从以下类型的输入中提取一个数字7: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
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"