Perl:如何在两个相同的模式之间打印行?

Perl:如何在两个相同的模式之间打印行?,perl,delimiter,Perl,Delimiter,我有一些数据叫做data_range.txt。最后,我希望将数据加载到数组中并比较字符串。但是,我无法打印这两种模式之间的线条 -- 2020-10-07T22:14:27,545 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=191216CV0 2020-10-07T22:14:27,554 INFO [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@ -- 20

我有一些数据叫做data_range.txt。最后,我希望将数据加载到数组中并比较字符串。但是,我无法打印这两种模式之间的线条

--
2020-10-07T22:14:27,545 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=191216CV0
2020-10-07T22:14:27,554 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@
--
2020-10-07T22:43:12,345 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=00774MAB1
2020-10-07T22:43:12,354 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@
--
2020-10-07T22:44:02,028 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=00774MAB1
2020-10-07T22:44:02,036 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@
--
2020-10-07T22:55:10,691 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=71647NBE8
2020-10-07T22:55:10,703 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@
--
--
2020-10-07T22:14:27545调试[recvMsgProc-0]调用:参数=191216CV0
2020-10-07T22:14:27554信息[recvMsgProc-0]结果kx.Flip@
--
2020-10-07T22:43:12345调试[recvMsgProc-1]调用:参数=00774MAB1
2020-10-07T22:43:12354信息[recvMsgProc-1]结果kx.Flip@
--
2020-10-07T22:44:02028调试[recvMsgProc-0]调用:参数=00774MAB1
2020-10-07T22:44:02036信息[recvMsgProc-0]结果kx.Flip@
--
2020-10-07T22:55:10691调试[recvMsgProc-1]调用:参数=71647NBE8
2020-10-07T22:55:10703信息[recvMsgProc-1]结果kx.Flip@
--
我有一个脚本,当我尝试在两个不同的模式之间打印时,它通常可以工作,但是这些模式是相同的

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

my $file = 'data_range.txt';
open my $fh, $file  or die "Can't open $file: $!";

# Build the start and end patterns
my $beg = qr/--/;
my $end = qr/--/;

while (<$fh>)
{
    if (/$beg/ .. /$end/) {
        print if not /$end/;
    }
}
#/usr/bin/perl
使用警告;
严格使用;
my$file='data_range.txt';
打开我的$fh,$文件或死亡“无法打开$file:$!”;
#构建开始和结束模式
我的$beg=qr/--/;
my$end=qr/--/;
而()
{
如果(/$beg/./$end/){
如果没有打印/$end/;
}
}

您需要稍微修改条件,以不跳过每一个第二部分

if (/--/ .. /--/ && next) {
    print;
}
但是,放弃range操作符而使用输入记录分隔符可能会更干净:

local $/ = "--\n";
while (<>) {
    # Here $_ contains all the lines of a section
    my @lines = split /\n/;
    # ...
}
local$/=“--\n”;
而(){
#此处$\包含节的所有行
我的@lines=split/\n/;
# ...
}

您需要稍微修改条件,以不跳过每一个第二部分

if (/--/ .. /--/ && next) {
    print;
}
但是,放弃range操作符而使用输入记录分隔符可能会更干净:

local $/ = "--\n";
while (<>) {
    # Here $_ contains all the lines of a section
    my @lines = split /\n/;
    # ...
}
local$/=“--\n”;
而(){
#此处$\包含节的所有行
我的@lines=split/\n/;
# ...
}

使用
grep
预处理输入以删除
--
行,以及
粘贴
将输入更改为每行包含2条记录的文件,默认情况下在选项卡上加入。通过将选项卡上的记录拆分为每行2条记录的数组,可以轻松解析结果

grep -v '^--' data_range.txt | paste - - | perl -F'\t' -lane 'print join "\t", map { qq{"$_"} } @F;'

# Prints:

"2020-10-07T22:14:27,545 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=191216CV0"     "2020-10-07T22:14:27,554 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@"
"2020-10-07T22:43:12,345 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=00774MAB1"     "2020-10-07T22:43:12,354 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@"
"2020-10-07T22:44:02,028 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=00774MAB1"     "2020-10-07T22:44:02,036 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@"
"2020-10-07T22:55:10,691 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=71647NBE8"     "2020-10-07T22:55:10,703 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@"
grep-v'^--'data_range.txt | paste--| perl-F'\t'-lane'print join'\t',map{qq{$\u}}@F;'
#印刷品:
“2020-10-07T22:14:27545调试[recvMsgProc-0]调用:参数=191216CV0”“2020-10-07T22:14:27554信息[recvMsgProc-0]结果kx.Flip@”
“2020-10-07T22:43:12345调试[recvMsgProc-1]调用:参数=00774MAB1”“2020-10-07T22:43:12354信息[recvMsgProc-1]结果kx.Flip@”
“2020-10-07T22:44:02028调试[recvMsgProc-0]调用:参数=00774MAB1”“2020-10-07T22:44:02036信息[recvMsgProc-0]结果kx.Flip@”
“2020-10-07T22:55:10691调试[recvMsgProc-1]调用:参数=71647NBE8”“2020-10-07T22:55:10703信息[recvMsgProc-1]结果kx.Flip@”
Perl one liner使用以下命令行标志:
-e
:告诉Perl在线查找代码,而不是在文件中。
-n
:一次循环输入一行,默认情况下将其分配给
$。
-l
:在行内执行代码之前,先去掉输入行分隔符(
“\n”
,默认情况下在*NIX上),然后在打印时将其追加。
-a
:在空格或
-F
选项中指定的正则表达式上将
$\ucode>拆分为数组
@F

-F'/\t/'
:在选项卡上拆分为
@F
,而不是在空白处

另请参见:

使用
grep
预处理输入以删除
--
行,以及
粘贴
将输入更改为每行包含2条记录的文件,默认情况下在选项卡上加入。通过将选项卡上的记录拆分为每行2条记录的数组,可以轻松解析结果

grep -v '^--' data_range.txt | paste - - | perl -F'\t' -lane 'print join "\t", map { qq{"$_"} } @F;'

# Prints:

"2020-10-07T22:14:27,545 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=191216CV0"     "2020-10-07T22:14:27,554 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@"
"2020-10-07T22:43:12,345 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=00774MAB1"     "2020-10-07T22:43:12,354 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@"
"2020-10-07T22:44:02,028 DEBUG [recvMsgProc-0] <KdbQMHandler> calling:parameters=00774MAB1"     "2020-10-07T22:44:02,036 INFO  [recvMsgProc-0] <KdbQMHandler> resultkx.Flip@"
"2020-10-07T22:55:10,691 DEBUG [recvMsgProc-1] <KdbQMHandler> calling:parameters=71647NBE8"     "2020-10-07T22:55:10,703 INFO  [recvMsgProc-1] <KdbQMHandler> resultkx.Flip@"
grep-v'^--'data_range.txt | paste--| perl-F'\t'-lane'print join'\t',map{qq{$\u}}@F;'
#印刷品:
“2020-10-07T22:14:27545调试[recvMsgProc-0]调用:参数=191216CV0”“2020-10-07T22:14:27554信息[recvMsgProc-0]结果kx.Flip@”
“2020-10-07T22:43:12345调试[recvMsgProc-1]调用:参数=00774MAB1”“2020-10-07T22:43:12354信息[recvMsgProc-1]结果kx.Flip@”
“2020-10-07T22:44:02028调试[recvMsgProc-0]调用:参数=00774MAB1”“2020-10-07T22:44:02036信息[recvMsgProc-0]结果kx.Flip@”
“2020-10-07T22:55:10691调试[recvMsgProc-1]调用:参数=71647NBE8”“2020-10-07T22:55:10703信息[recvMsgProc-1]结果kx.Flip@”
Perl one liner使用以下命令行标志:
-e
:告诉Perl在线查找代码,而不是在文件中。
-n
:一次循环输入一行,默认情况下将其分配给
$。
-l
:在行内执行代码之前,先去掉输入行分隔符(
“\n”
,默认情况下在*NIX上),然后在打印时将其追加。
-a
:在空格或
-F
选项中指定的正则表达式上将
$\ucode>拆分为数组
@F

-F'/\t/'
:在选项卡上拆分为
@F
,而不是在空白处

另请参见:

\n--\n
如果要避免额外的尾随换行符。
\n--\n
如果要避免额外的尾随换行符。