尝试仅删除非ASCII字符

10
我正在尝试操作一个文本文件,从中删除非ASCII字符。我不想删除行,只想删除有问题的字符。我正在尝试让以下表达式起作用:sed '/[\x80-\xFF]/d'。

1
请查看这个答案。 - speakr
1
这个线程可能有你正在寻找的答案 https://dev59.com/smoy5IYBdhLWcg3wa9Qj - Ifthikhan
您的命令将删除所有包含非ASCII字符的行。如果这不是您想要的,请检查重复的问题。 - Chris Dodd
我尝试了两个命令:1)sed -E 's/[^[:print:]]//' <-- 这应该可以删除非可打印字符。然而,非可打印的东西仍然出现。当我尝试使用sed -E 's/[\d128-\d255]//'时,我会得到一个无效的排序错误。是否有其他命令可以建议只删除非ASCII字符? - M_x_r
第一个评论链接中有一个不错的Perl示例。如果您所说的“任何其他命令”是指这个,那么就可以了。 - Josh
谢谢Josh,但我想用Sed或者TR来完成它。 - M_x_r
1个回答

44
建议的解决方案可能在某些版本的sed中失败,例如GNU sed 4.2.1。
使用 tr
tr -cd '[:print:]' < yourfile.txt

这将删除除 [\x20-\x7e] 以外的任何字符。

如果您想保留例如换行符,则只需添加 \n

tr -cd '[:print:]\n' < yourfile.txt

如果您真的想保留所有ASCII字符(甚至是控制码):
tr -cd '[:print:][:cntrl:]' < yourfile.txt

这将删除不在[\x00-\x7f]范围内的任何字符。

1
嘿,讲者,有没有方法保留文本文件的格式?tr命令将所有内容都放在一行上,是吗? - M_x_r
1
@bosra:我添加了一个示例来保留换行符。 - speakr
哥们,要是我能再点赞几次的话,我一定会的。谢谢! - M_x_r
你有任何想法为什么 Meld 仍然会将固定的文件视为二进制文件吗?顺便说一下,结果似乎与tr -cd'\11\12\15\40-\176'不同,后者在 Meld 中可以使用(至少对于我的文件)[参考](http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix)。 - Aquarius Power
这个问题对我帮助很大,但是因为我想在输出文件中保留\n和\t,所以我使用了下面的命令:tr -cd '[:print:][/n/t]' < yourfile.txt > output.txt - ccoutinho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接