我想要在原地从文件中删除所有的非ASCII字符。
我找到了一个使用tr命令的解决方案,但我猜我需要在修改后将该文件写回。
我需要在原地进行操作,并且性能相对较好。
有什么建议吗?
我想要在原地从文件中删除所有的非ASCII字符。
我找到了一个使用tr命令的解决方案,但我猜我需要在修改后将该文件写回。
我需要在原地进行操作,并且性能相对较好。
有什么建议吗?
perl -i.bak -pe 's/[^[:ascii:]]//g' <你的文件>
-i
表示文件将被直接编辑,备份文件将保存为 .bak
扩展名。stdin
作为输入。 - h3xStreamsed
解决方案正常工作,但这个解决方案非常好用。 - steve klein# -i (inplace)
sed -i 's/[\d128-\d255]//g' FILENAME
LANG=C sed -i 's/[\d128-\d255]//g' FILE
来避免“无效排序字符”错误。 - PatrickLC_ALL=C
来解决了“无效排序字符”错误。 - Diomidis Spinellis我尝试了所有的解决方案,但都没有效果。然而,以下方法有效:
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
tr -cd '[:print:]\n\r' < file.txt
。 - Juantr -cd '[:print:]' <file.txt | sponge file.txt
- evandrixsed -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'
# 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