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