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