我想从文件中删除所有非 ASCII 字符。
我找到了一种使用 tr 的解决方案,但我想我需要在修改后写回该文件。
我需要做得到位,并且性能比较好。
Perl oneliner 就可以:
perl -i.bak -pe 's/[^[:ascii:]]//g' <your file>
-i
表示将就地编辑文件,并且将以扩展名 .bak
保存备份。
# -i (inplace)
sed -i 's/[\d128-\d255]//g' FILENAME
我尝试了所有的解决方案,但没有任何效果。然而,以下内容确实如此:
tr -cd '\11\12\15\40-\176'
我在这里找到的:
https://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix
我的问题需要在一系列管道程序中使用它,而不是直接来自文件,因此请根据需要进行修改。
尝试使用
tr
代替 sed
tr -cd '[:print:]' < file.txt
sed -i 's/[^[:print:]]//' FILENAME
另外,这就像 dos2unix
# -i (inplace)
LANG=C sed -i -E "s|[\d128-\d255]||g" /path/to/file(s)
LANG=C
部分的作用是避免Invalid collation character
错误。
基于 Ivan 的回答 和 Patrick 的评论。
我使用的是一个非常小的 busybox 系统,其中不支持
tr
或 POSIX 字符类中的范围,所以我必须以蹩脚的老式方式来做。 这是使用 sed
的解决方案,从文件中删除所有不可打印的非 ASCII 字符:
sed -i 's/[^a-zA-Z 0-9`~!@#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILE
这对我有用:
sed -i 's/[^[:print:]]//g'
作为 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'
awk '{ sub("[^a-zA-Z0-9\"!@#$%^&*|_\[](){}", ""); print }' MYinputfile.txt > pipe_out_to_CONVERTED_FILE.txt
我很欣赏我在这个网站上找到的提示。
但是,在我的 Windows 10 上,我必须使用双引号才能使其工作......
sed -i "s/[\d128-\d255]//g" FILENAME
注意到这些事情...
对于 FILENAME 为整个路径 需要引用 ame 这没用--
%TEMP%\"FILENAME"
这样做了——%TEMP%\FILENAME"
sed 在当前目录中留下临时文件,名为 sed*