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 shell 不像 Unix shell 那样解释单引号。您应该在命令中使用双引号。

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 回答