gpt4 book ai didi

regex - Perl 正则表达式脚本和命令行不同

转载 作者:行者123 更新时间:2023-12-01 07:46:48 25 4
gpt4 key购买 nike

所以我试图从日志行中删除嵌入的\n 而不是从命令行中删除每个日志行的\n 。我已经尝试过这些,它们都将\n 全部更改为 ~。

    cat test1.txt | perl -n -e 's{\n(?!2013)}{~}mg;print' > test1a.fix
perl -n -e 's{\n(?!2013)}{~}mg;print' test1.txt > test1b.fix

都忽略了背后负面的目光。

test1.txt 包含

    2013-03-01 12:23:59,1
line2
line3
2013-03-01 12:23:59,4

包含test1a.fix和test1b.fix

    2013-03-01 12:23:59,1~line2~    line3~2013-03-01 12:23:59,4

但我想出了使用这个脚本的正则表达式。

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

sub test {
my ($str, $expect) = @_;
my $mod = $str;
$mod =~ s{\n(?!2013)}{~}mg;
print "Expecting '$expect' got '$mod' - ";
print $mod eq $expect ? "passed\n" : "failed\n";
}

test("2013-03-01 12:23:59,line1
line2
line3
2013-03-01 12:23:59,line4", "2013-03-01 12:23:59,line1~line2~ line3
2013-03-01 12:23:59,line4");

它会产生以下与我想要的相匹配的输出。

    sfager@linux-sz05:~/logs> ./regex_test.pl 
Expecting '2013-03-01 12:23:59,line1~line2~ line3
2013-03-01 12:23:59,line4' got '2013-03-01 12:23:59,line1~line2~ line3
2013-03-01 12:23:59,line4' - passed
sfager001@linux-sz05:~/logs>

谁能解释为什么它们的工作方式不同以及如何在命令行上完成?

最佳答案

perl -n 一次一行地处理文件。当它读取一行时,换行符位于字符串的末尾,而不是正则表达式所期望的开头。您应该使用 ^ 来匹配行的开头而不是 \n

在函数版本中,您一次处理整个多行字符串。在这种情况下,换行符位于字符串的中间,并且它们与正则表达式匹配。

关于regex - Perl 正则表达式脚本和命令行不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15734159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com