4

各行の先頭に行番号を追加してファイルを変更したいと思います。次のコマンドがこれを行うことがわかりました。

cat file | perl -pe '$_ = "$. $_"' > file_with_line_numbers

これは機能しているようですが、vim でファイルを開くと、^@ と ^M の文字でいっぱいです。さらに調査すると、エンコーディングが変更されていることがわかります。

> file -bi file
text/plain; charset=utf-16le

> file -bi file_with_line_numbers
application/octet-stream; charset=binary

ここで何が欠けていますか?

4

2 に答える 2

9

入力データをデコードしておらず、出力データをエンコードしていないため、連結$.する$_ことで、2 つの異なるエンコーディングのデータが混在している (むしろ、バイト文字列と文字列が混在している)しかし、perl は暗黙的にバイト文字列を文字列に変換しており、必要なものに対して非常に間違った方法で変換しています)。

1つの修正は次のとおりです。

perl -pe  'BEGIN { binmode STDIN, ":encoding(utf16le)"; binmode STDOUT, ":encoding(utf16le)" } $_ = "$. $_";' < input > output
于 2013-01-02T17:22:41.360 に答える