2012-02-01 67 views
0

我目前在WinXP上運行Strawberry Perl,我正在嘗試處理一個unix格式的平面文件。平面文件使用換行符來分隔字段,並使用供稿字符來分隔記錄。我試圖將FF轉換爲其他任何東西(CRLF,';',TAB等)。我曾嘗試使用下面的Perl的俏皮話,但沒有成功嘗試:爲什麼Strawberry 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新手,所以也許我錯過了一些東西?有誰知道爲什麼上述命令不能做我想讓他們做的事情?

+0

這可能是我的問題的重要組成部分。我只是試着用雙引號,而s ///命令實際上取代了FF字符!然而,它仍然不能滿足我需要的功能,我認爲外星生命形式的使用binmode()的建議可能是解決方案的其他部分。 – 2012-02-01 18:39:43

回答

8

的問題是,Windows外殼不解釋單引號中的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 
+0

。 'perl -pe s/\ f/__ FF __ /'根本沒有引號也可以。 – mob 2012-02-01 18:34:50

+0

如何使用輸入文本文件使用binmode?使用雙引號允許命令實際工作(替換煩人的\ f),但是我仍然將所有\ n轉換爲\ r \ n。 – 2012-02-01 18:45:02

+1

只需添加'binmode STDOUT'調用就足以取消'\ r \ n'行爲:'perl -pe「binmode STDOUT; s/\ f/\ n/g」 – mob 2012-02-01 18:58:04

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. 
+0

Binmode會阻止在窗口上將'\ n'轉換爲'\ r \ n',但它不會幫助匹配'\ f'。 – 2012-02-01 18:10:53

+1

我很難找到使用binmode單線程的語法示例。我的上面的例子是什麼樣的binmode?對於沒有空格或文件名通配符的命令,根本沒有引號或 – 2012-02-01 18:24:22

相關問題