2009-09-09 106 views
0

我有一個這樣的文件:如何刪除除換行符之外的所有非單詞字符?

my line - some words & text 
oh lóok i've got some characters 

我想「正常化」,並刪除所有非單詞字符。我想這樣的事情結束了:

mylinesomewordstext 
ohlóokivegotsomecharacters 

我此刻的命令行中使用Linux,而我希望能有一些一班輪我可以使用。

我嘗試這樣做:

cat file | perl -pe 's/\W//' 

但是,刪除所有的換行,把一切一行。有什麼我可以告訴Perl不要在\W中包含換行符?或者有其他方法嗎?

回答

7

這將刪除不符合\w\n字符:

cat file | perl -C -pe 's/[^\w\n]//g' 
+0

這會在原始文本中刪除帶重音符號的o。 – 2009-09-09 11:24:33

+0

您必須在命令中添加一個標誌才能使其具有Unicode意識-C應該這樣做。 http://perldoc.perl.org/perlrun.html#Command-Switches – 2009-09-09 12:37:34

+0

對,改變了。 – sth 2009-09-09 13:18:52

1

以前的響應沒有呼應「O」字。至少在我的情況下。

sed 's/\W//g' file 
+1

無用的貓使用 – camh 2009-09-09 12:33:25

+0

true。我看到它太遲=/ – dcruz 2009-09-09 12:52:17

+1

隨時編輯你的答案。 – Ether 2009-09-09 16:13:59

4

@ sth的解決方案使用Perl(至少在我的系統上)不兼容Unicode,因此它失去了重音o字符。

在另一方面,sed是(根據the lists on this page兼容Unicode,並給出了正確的結果:

$ sed 's/\W//g' a.txt 
mylinesomewordstext 
ohlóokivegotsomecharacters 
1

用於外殼腳本最佳實踐要求,你應該使用TR程序替換單字符而不是sed,因爲它更快,更高效。如果更換更長的字符串,顯然使用sed。

TR -d '[:空白:] [:PUNCT:]' <文件

當時間運行我得到:

真正0m0.003s
用戶0m0 .000s
SYS 0m0.004s

當我運行sed的答案(SED -e 'S/\ W // G' 文件),隨着時間的推移,我得到:

真正0m0.003s
用戶0m0.004s
SYS 0m0.004s

雖然不是「巨大的「差異,你會注意到與大型數據集運行時的差異。另請注意,我沒有將cat的輸出轉換爲tr,而是使用I/O重定向(少一個產生的進程)。

perl -ple 's/\W//g' file 

請注意,您不需要:通過追加到每個打印()結束

2

在Perl中,我只是添加-l開關,重新添加新行cat

相關問題