web-dev-qa-db-ja.com

Perlで、ファイルから^ Mを削除する方法は?

既存のCSVに新しいフィールドを追加するスクリプトがありますが、^M文字が古い行の最後に表示されるため、新しいフィールドは同じ行ではなく新しい行になります。 Perlを使用してCSVファイルから^M文字を削除するにはどうすればよいですか?

33
Alex Wong

あなたもこれを行うことができることがわかりました:

$line=~ tr/\015//d;
14
Alex Wong

^ Mは復帰です。あなたはこれを行うことができます:

$str =~ s/\r//g
46
Can Berk Güder

または1ライナー:

Perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
23
JDrago

少し関係ありませんが、Perlを使用してコマンドラインから^ Mを削除するには、次のようにします。

Perl -p -i -e "s/\r\n/\n/g" file.name
7
Roy Rico

私は、DOSまたはUnixの入力で動作する、より一般的なソリューションを好みます。入力がSTDINからであると仮定します:

while (defined(my $ln = <>))
  {
    chomp($ln);
    chop($ln) if ($ln =~ m/\r$/);

    # filter and write
  }
6
KillerRabbit

この1つのライナーは、すべての^ M文字を置き換えます。

dos2unix <file-name>

これは、Perlの内部から、またはUnixプロンプトで直接呼び出すことができます。

2
Akhil

DOSスタイルをUNIXスタイルの行末に変換するには:

for ($line in <FILEHANDLE>) {
   $line =~ s/\r\n$/\n/;
}

または、UNIXおよび/またはDOSスタイルの行末を削除するには:

for ($line in <FILEHANDLE>) {
   $line =~ s/\r?\n$//;
}
1
spoulson

これが私の問題を解決したものです。 ^ Mはキャリッジリターンであり、Perlスクリプトでは簡単に回避できます。

while(<INPUTFILE>)
{
     chomp;
     chop($_) if ($_ =~ m/\r$/);
}
1
user3274263

そのための小さなスクリプト。これを修正することで、クロスプラットフォームのレガシーファイル内の他の印刷できない文字を除外することができました。

#!/usr/bin/Perl
# run this as
# convert_dos2unix.pl < input_file > output_file
undef $/;
$_ = <>;
s/\r//ge;
print;