从Bash中删除字符串中的所有特殊字符

时间:2016-04-28 23:12:22

标签: bash tr mint

我有很多小写的文字,唯一的问题是,有很多特殊字符,我想用数字删除它。

下一个命令它不够强大:

tr -cd '[alpha]\n '

如果是éćščž和其他一些人,则返回“?”但我想删除所有这些。有更强的命令吗?

我使用linux mint 4.3.8(1)-release

3 个答案:

答案 0 :(得分:20)

您可以使用tr仅打印如下字符串中的可打印字符。只需在输入文件中使用以下命令即可。

tr -cd "[:print:]\n" < file1   

标志-d用于删除输入流中参数中定义的字符集,而-c用于补充那些(反转提供的内容)。因此,如果没有-c,命令将从输入流中删除所有可打印字符,并使用它通过删除不可打印字符来补充它。我们还保留换行符\n以保留输入文件中的行结尾。删除它只会产生一个大的最终输出。

[:print:]只是一个POSIX bracket expression,它是表达式[:alnum:][:punct:]和空格的组合。 [:alnum:][0-9A-Za-z]相同,[:punct:]包含字符! " # $ % {{1 }} & ' ( ) * + , - . {{1 }} / : ; < = > ? @ [ {{1 }} \ ] ^ _ ` {

答案 1 :(得分:4)

我不完全确定文本来自您的问题的位置,但我们只是说“小写的大量文本”位于名为special.txt的文件中,您可以执行以下操作,但重点更多在你想要保留的角色上:

cat special.txt | sed 's/[^a-z  A-Z]//g'

这有点像用斧头做手术。

帖子Remove non-ascii characters from ...

中的另一个可能的解决方案

如果上述问题无法解决您的问题,请尝试提供更多详细信息,我可能会提供更具可操作性的答案。

答案 2 :(得分:0)

只想添加我一点。下面的代码将更好地消除上述所有字符,并将它们替换为空格并同时保留换行符

    tr -s "[:punct:]" " "

从手动输入-s

  

将输入中最后一个操作数(字符串1或字符串2)中列出的多个字符压缩为单个字符实例。在所有删除和翻译完成后会发生这种情况。