在 Unix shell 中从文件中删除非 ASCII 字符

问题描述 投票:0回答:11

我想从文件中删除所有非 ASCII 字符。

我找到了一种使用 tr 的解决方案,但我想我需要在修改后写回该文件。

我需要做得到位,并且性能比较好。

shell awk sed non-ascii-characters
11个回答
87
投票

Perl oneliner 就可以:

perl -i.bak -pe 's/[^[:ascii:]]//g' <your file>

-i
表示将就地编辑文件,并且将以扩展名
.bak
保存备份。


55
投票
# -i (inplace)

sed -i 's/[\d128-\d255]//g' FILENAME

42
投票

我尝试了所有的解决方案,但没有任何效果。然而,以下内容确实如此:

tr -cd '\11\12\15\40-\176'

我在这里找到的:

https://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

我的问题需要在一系列管道程序中使用它,而不是直接来自文件,因此请根据需要进行修改。


20
投票

尝试使用

tr
代替 sed

tr -cd '[:print:]' < file.txt

16
投票
sed -i 's/[^[:print:]]//' FILENAME

另外,这就像 dos2unix


10
投票
# -i (inplace)

LANG=C sed -i -E "s|[\d128-\d255]||g" /path/to/file(s)

LANG=C
部分的作用是避免
Invalid collation character
错误。

基于 Ivan 的回答 和 Patrick 的评论。


6
投票

我使用的是一个非常小的 busybox 系统,其中不支持

tr
或 POSIX 字符类中的范围,所以我必须以蹩脚的老式方式来做。 这是使用
sed
的解决方案,从文件中删除所有不可打印的非 ASCII 字符:

sed -i 's/[^a-zA-Z 0-9`~!@#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILE

6
投票

这对我有用:

sed -i 's/[^[:print:]]//g'

3
投票

作为 sed 或 perl 的替代方案,您可以考虑使用 ed(1) 和 POSIX 字符类。

注意:ed(1) 将整个文件读入内存以就地编辑,因此对于非常大的文件,您应该使用 sed -i ...、perl -i ...

# see:
# - http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed
# - http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

# test
echo $'aaa \177 bbb \200 \214 ccc \254 ddd\r\n' > testfile
ed -s testfile <<< $',l' 
ed -s testfile <<< $'H\ng/[^[:graph:][:space:][:cntrl:]]/s///g\nwq'
ed -s testfile <<< $',l'

3
投票
awk '{ sub("[^a-zA-Z0-9\"!@#$%^&*|_\[](){}", ""); print }' MYinputfile.txt > pipe_out_to_CONVERTED_FILE.txt

0
投票

我很欣赏我在这个网站上找到的提示。

但是,在我的 Windows 10 上,我必须使用双引号才能使其工作......

sed -i "s/[\d128-\d255]//g" FILENAME

注意到这些事情...

  1. 对于 FILENAME 为整个路径 需要引用 ame 这没用--

    %TEMP%\"FILENAME"
    这样做了——
    %TEMP%\FILENAME"

  2. sed 在当前目录中留下临时文件,名为 sed*

© www.soinside.com 2019 - 2024. All rights reserved.