そのため、コマンドラインから各ログ行の \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>
これらの動作が異なる理由と、コマンドラインでこれを行う方法を誰かが説明できますか?