2011-05-21 78 views
1

我有應用程序在unix和窗口中讀取的文件。但是,在數據中間以^ M讀取窗口時遇到問題。我只是想要刪除^ M在行中,如字段4和字段5.如何刪除行中的回車

我已經嘗試使用perl -pe 's/\cM\cJ?//g',但它將一切都刪除到一行,我不想。我想將數據留在同一行,但刪除多餘的人

# Comment^M 
# field1_header|field2_header|field3_header|field4_header|field5_header|field6_header^M 
#^M 
field1|field2|field3|fie^Mld4|fiel^Md5|field6^M 
^M 

感謝

回答

0

聽起來像最簡單的解決辦法可能是UNIX和Windows之間移動之前檢查你的文件類型。 dos2unixunix2dos可能是你真正需要的,而不是一個正則表達式。

我不確定什麼字符^M應該是,但回車是\015\r。所以,s/\r//g應該就足夠了。記住它也會刪除你最後的回車,如果這是你想保留的東西。

0
use strict; 
use warnings; 

my $a = "field1|field2|field3|fie^Mld4|fiel^Md5|field6^M"; 

$a =~ s/\^M(?!$)//g; 

print $a; 
+0

我不認爲「... fied4 | fied5 ...」是什麼意思... – ysth 2011-05-22 08:40:26

+0

你是什麼意思? – 2011-05-22 11:44:18

+0

您是否嘗試過您的代碼並查看輸出?它也是在^ M之後刪除角色。 – ysth 2011-05-22 16:24:32

1

只刪除CR一條線的中間:

perl -pe 's/\r(?!\n)//g' 

你也可以這樣寫perl -pe 's/\cM(?!\cJ)//g'?!構造是negative look-ahead expression。模式匹配一​​個CR,但只有當它沒有跟隨一個LF時。

當然,如果產生一個文件,UNIX換行是可以接受的,你可以簡單地去除所有CR字符:

perl -pe 'tr/\015//d' 

你寫什麼,s/\cM\cJ?//g,去掉一個CR和之後的LF是否有一個,因爲LF是匹配模式的一部分。

+0

不要使用八進制,太容易混淆和容易出錯......你證明了自己使用'\ 010'而不是'\ 012'。使用'\ r'和'\ n',要清楚得多。 – mscha 2011-05-22 19:22:29

+0

@mscha:'\ n'和公司略有不同:他們的意思是「無論在這個平臺上的CR」,都不是特定的字節值。這無疑主要是理論上的,因爲在Windows和Unix上'\ r'是ASCII CR和'\ n'是ASCII LF,而其他平臺是非常邊緣的。 – Gilles 2011-05-22 19:45:57

+0

在Windows上,「\ n」是「\ 015 \ 012」 在Unix/Linux上,「\ n」是「\ 012」 您應該更改信息並刪除「\ n」。 – 2011-05-23 10:08:04