我有一个这样的文件:
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
中包含换行符?或者还有其他方式吗?
答案 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重定向(少生成一个进程)。