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

Removing all special characters from a string in Bash

我有很多小写文本,唯一的问题是,有很多特殊字符,我也想用数字将其全部删除。

下一个命令不够强大:

tr -cd '[alpha]\n '

对于 éćščž 和其他一些人,returns“?”但我想删除所有这些。有没有更强的命令?

我使用 linux mint 4.3.8(1)-release

我不确定你的问题中的文本来自哪里,但可以说 "lot of text in lowercase" 在名为 special.txt 的文件中你可以做类似下面的事情但更专注关于您要保留的字符:

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

虽然有点像用斧头做手术。

postRemove non-ascii characters from ...

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

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

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

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

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

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

只是想添加我的一点。下面的代码将更好地摆脱上面解释的所有字符,并将它们替换为 space 并同时保留换行符

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

来自手动输入 -s

Squeeze multiple occurrences of the characters listed in the last operand (either string1 or string2) in the input into a single instance of the character. This occurs after all deletion and translation is completed.