从CSV中删除非ASCII字符

时间:2010-07-26 18:47:24

标签: sed awk

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

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

我需要以相对好的表现来做到这一点。

有什么建议吗?

11 个答案:

答案 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

注意到这些事情......

  1. 对于FILENAME,需要引用整个路径\名称 这没有用 - %TEMP%\"FILENAME" 这样做 - %TEMP%\FILENAME"

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