我想通过 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