2010-08-06 49 views
1

尋找一種方法來chomp換行符,而不管創建文件的平臺如何。在unix,windows和mac文本文件上工作的多平臺chomp

perlport#newlines指定的問題是,換行每個平臺上不同編碼:

\ 012 UNIX

\ 015 \ 012窗戶

\ 015 MAC

然而,格格是特定於平臺的,只會刪除正在運行的平臺的字符,或者由變量設置的任何內容。

到目前爲止,我想出了下面的正則表達式,這似乎是工作:

# multiplatform chomp 
s/\015?\012?$//; 

是正確的解決辦法還是我失去了一些案件,有一個更好的?

+0

如果你正在讀一個文件',而(){...}'你只能得到一個線在Unix系統上的Mac文件。所以除非你的chomp純粹是爲了理論目的,否則你必須將文件分割成邏輯行。 – jmz 2010-08-06 13:04:05

+1

我認爲Macs現在終於明智地做了一些事情 - 即:* nix方式 - 自OSX以來。 – cHao 2010-08-06 13:18:35

+0

是的,除非您正在使用舊系統和文件,否則現在很難看到舊式的Mac系列結局。即使在這種情況下,我只是簡單地將文件轉換爲unix格式,然後再處理它們。 – Ether 2010-08-06 14:51:00

回答

1

\ v匹配垂直的白色空間,所以你應該能夠使用

s/\v+$//; 

然而,這種假設你不介意切斷之類的東西表單提要和垂直製表符。

2

爲什麼不直接使用

s/\s+$//; 
+0

這也將修剪線條,但我可以忍受這一點,因爲它似乎是一個更優雅的解決方案。謝謝! – Tomasz 2010-08-06 14:57:39

0

如果你真的想抓住所有的情況下,你的正則表達式適用於剝離換行符。但是檢查一個換行符是否存在並不好,它會很樂意匹配沒有換行符的行。爲此,你必須拼出全部。

m{(\015|\015\012|\012)\z}; 

請注意使用\z。這是因爲$將匹配行尾的換行符,該行將從捕獲組中偷取。

實際上,您不必擔心「Mac」換行符。 「Mac」換行符指的是OS X之前的MacOS。它是極其不太可能你會遇到那個時代的文件,我說這是一個仍在工作的人Mac SE。所以你真正需要擔心的是Windows和Unix新行。這就是典型的做法,像這樣:

s{\015?\012\z}{}; 
相關問題