-1

我有一个这样的文件:

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? 还是有其他方法?

4

5 回答 5

8

这将删除不匹配的字符\w\n

cat file | perl -C -pe 's/[^\w\n]//g'
于 2009-09-09T11:09:10.180 回答
4

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

另一方面,sed Unicode 兼容的(根据此页面上的列表),并给出正确的结果:

$ sed 's/\W//g' a.txt
mylinesomewordstext
ohlóokivegotsomecharacters
于 2009-09-09T11:32:08.317 回答
2

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

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

请注意,您不需要cat.

于 2009-09-10T15:10:28.563 回答
1

先前的响应没有回显“ó”字符。至少在我的情况下。

sed 's/\W//g' file
于 2009-09-09T11:30:17.087 回答
1

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

tr -d '[:blank:][:punct:]' <文件

随着时间的推移,我得到:

实际 0m0.003s
用户 0m0.000s
系统 0m0.004s

当我运行 sed 答案(sed -e 's/\W//g' 文件)时,我得到:

真实 0m0.003s
用户 0m0.004s
系统 0m0.004s

虽然不是“巨大”的差异,但在运行更大的数据集时您会注意到差异。另请注意,我没有将 cat 的输出通过管道传输到 tr,而是使用 I/O 重定向(产生的进程少了一个)。

于 2009-09-09T17:25:05.633 回答