【问题标题】:Removing all special characters from a string in Bash从 Bash 中的字符串中删除所有特殊字符
【发布时间】:2026-01-14 11:50:02
【问题描述】:

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

下一个命令不够强:

tr -cd '[alpha]\n '

在 éćščž 和其他一些情况下,它返回“?”但我想删除所有这些。有没有更强的命令?

我使用的是 linux mint 4.3.8(1)-release

【问题讨论】:

  • 每个角色都有其独特之处。
  • 你的问题不是很清楚。提供更多背景信息可能会吸引更多有用的回应。

标签: bash shell tr linux-mint


【解决方案1】:

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

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

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

[:print:] 只是一个POSIX bracket expression,它是表达式[:alnum:][:punct:] 和空格的组合。在[:alnum:]是相同[0-9A-Za-z][:punct:]包括字符! 987654335 # 987654337 % 987654339 ' 987654341 ) 987654343 + 987654345 - 987654347 / 987654349 ; 987654351 = 987654353 ? 987654355 [ 987654357 ] 987654359 _ 987654361 @ {|}~

【讨论】:

  • 不幸的是 tr 的字符类 [:print:] 不包括每个语言环境中的所有字母,例如ä 在芬兰语中。
  • 关于 print 与 alnum punc 和空格相同的说法不正确。我遇到了字符弄乱我的终端的问题 tr -dc "[:alnum:][:punct:] \n" 修复了它,但 tr -dc "[:print:]\n" 没有。所以 allnum、punc、space 必须是 print 的一个子集。
【解决方案2】:

我不确定您的问题中的文本来自何处,但可以说“大量小写文本”位于名为 special.txt 的文件中,您可以执行以下操作,但更多地关注要保留的字符:

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

这有点像用斧头做手术。

帖子Remove non-ascii characters from ...中的另一种可能的解决方案

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

【讨论】:

    【解决方案3】:

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

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

    从手动输入 -s

    将输入中最后一个操作数(string1 或 string2)中列出的字符的多次出现压缩到字符的单个实例中。这发生在所有删除和翻译完成后。

    【讨论】: