2009-09-09 65 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

相关问题