如何删除换行符以外的所有非单词字符?

时间:2009-09-09 11:04:31

标签: perl text text-processing

我有一个这样的文件:

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中包含换行符?或者还有其他方式吗?

5 个答案:

答案 0 :(得分:7)

这会删除与\w\n不匹配的字符:

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

答案 1 :(得分:4)

@ sth的解决方案使用Perl,它(至少在我的系统上)不兼容Unicode,因此它会丢失带重音的字符。

另一方面,sed Unicode兼容(根据the lists on this page),并给出了正确的结果:

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

答案 2 :(得分:2)

在Perl中,我只是添加-l开关,它通过将换行添加到每个print()的末尾来重新添加换行符:

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

请注意,您不需要cat

答案 3 :(得分:1)

之前的回复并未回显“ó”字符。至少在我的情况下。

sed 's/\W//g' file

答案 4 :(得分:1)

shell脚本编写的最佳实践要求您应该使用tr程序替换单个字符而不是sed,因为它更快,更高效。如果替换更长的字符串,显然会使用sed。

  

tr -d'[:blank:] [: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重定向(少生成一个进程)。

相关问题