如何通过perl删除特定行中的换行符?

如何通过perl删除特定行中的换行符?

我想通过 perl 单行命令删除特定行中的换行符。

输入:

1407233497,1407233514,bar
1407233498,1407233515,foo
mingstats&fmt=n
1407233499,1407233516,foobar

预期输出:

1407233497,1407233514,bar
1407233498,1407233515,foomingstats&fmt=n
1407233499,1407233516,foobar

到目前为止我尝试了什么?

该正则表达式\n(?!\d+,\d+)与我要删除的换行符完全匹配。但我不知道如何通过perl一行命令来实现它。我试过,

perl -pe 's/\n(?!\d+,\d+)//g' file

但它会删除该文件中的所有换行符,并最终在一行中打印以下内容,

1407233497,1407233514,bar1407233498,1407233515,foomingstats&fmt=n1407233499,1407233516,foobar

如果 perl 单行命令使用上面的正则表达式,我会很高兴...

答案1

尝试:

$ perl -00pe 's/\n(?!\d+,\d+)//g' file
1407233497,1407233514,bar
1407233498,1407233515,foomingstats&fmt=n
1407233499,1407233516,foobar

perl默认情况下使用选项逐行读取文件-p,因此您的正则表达式无法工作。

-00选项打开段落吸音模式,您的正则表达式现在可以在多行上工作。

来自 perldoc perlrun:

-0[八进制/十六进制]

将输入记录分隔符 ($/ ) 指定为八进制或十六进制数。如果没有数字,则空字符是分隔符。其他开关可能位于数字之前或之后。例如,如果您有一个 find 版本,它可以打印以空字符结尾的文件名。

...

特殊值 00 将导致 Perl 以段落模式读取文件。任何 0400 或以上的值都会导致 Perl 读取整个文件,但按照惯例,值 0777 是通常用于此目的的值

答案2

perl -pe 'print "\n" if $c and !/^(?!\d+,\d+)/; $c=chomp; END{print "\n" if $c}' file_name

相关内容