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 1行のコマンドでこれを達成する方法がわかりません。頑張りました。

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

ただし、ファイル内のすべての改行が削除され、次の行が1行に印刷されます。

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

Perl 1行のコマンドが上記の正規表現を使用したことを嬉しく思います。

答え1

努力する:

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

perlデフォルトでは、オプションを使用してファイルを1行ずつ読み取るため、-p正規表現は機能しません。

-00オプションは短絡音吸収モードを有効にし、正規表現が複数行で動作するようになりました。

perldoc perlrunから:

-0[8進数/16進数]

入力レコード区切り文字($ /)を8進数または16進数で指定します。数字がない場合、ヌル文字は区切り文字です。他のスイッチは番号の前後に配置できます。たとえば、null で終わるファイル名を印刷する 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

関連情報