0

現在、WinXPでStrawberry Perlを実行しており、UNIX形式のフラットファイルを処理しようとしています。フラットファイルは、改行文字を使用してフィールドを区切り、フォームフィード文字を使用してレコードを区切ります。FFを他のもの(CRLF、';'、TABなど)に変換しようとしています。私は次のperlワンライナーを使用しようとしましたが成功しませんでした:

perl -p -e 's/\f/\r\n/g' < unix.txt > dos.txt
perl -p -e 's/\x0c/\x0d\x0a/g' < unix.txt > dos.txt
perl -p -e 's/\f/\t/g' < unix.txt > dos.txt

私が気付いた唯一のことは、dos.txtがすべてのLF文字をCRLFに変換してしまうことですが、FF文字は残ります。dos.txtファイルを再処理して、FFを置き換えようとしましたが、それでもサイコロはありません。私はまだPerlの初心者なので、何かが足りないのではないでしょうか。上記のコマンドが私が望んでいることを実行しない理由を誰かが知っていますか?

4

2 に答える 2

8

問題は、WindowsシェルがUnixシェルのように一重引用符を解釈しないことです。コマンドでは二重引用符を使用する必要があります。

C:\ perl -e "print qq/foo\fbar/" > test.txt
C:\ type test.txt
foo♀bar
C:\ perl -pe 's/\f/__FF__/' < test.txt
foo♀bar
C:\ perl -pe "s/\f/__FF__/" < test.txt
foo__FF__bar
于 2012-02-01T18:32:44.533 に答える
2

binmodeが必要です:

perldoc -f binmode
   binmode FILEHANDLE, LAYER
   binmode FILEHANDLE
           Arranges for FILEHANDLE to be read or written in "binary" or
           "text" mode on systems where the run-time libraries distinguish
           between binary and text files.  If FILEHANDLE is an expression,
           the value is taken as the name of the filehandle.  Returns true
           on success, otherwise it returns "undef" and sets $! (errno).

           On some systems (in general, DOS and Windows-based systems)
           binmode() is necessary when you're not working with a text
           file.
于 2012-02-01T18:07:18.800 に答える