从CSV中删除非ASCII字符

Suj*_*jit 54 awk sed

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

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

我需要以相对良好的性能来做到这一点.

有什么建议?

sse*_*vic 70

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

-i说该文件将在原地进行编辑,备份将以扩展名保存.bak.

  • perl解决方案比sed解决方案更快.尝试使用sed更新122 GB文件花了3个小时,而perl花了不到2个小时. (3认同)

Iva*_*van 41

# -i (inplace)

sed -i 's/[\d128-\d255]//g' FILENAME
Run Code Online (Sandbox Code Playgroud)

  • 在GNU sed 4.2.1上打印"无效的校对字符". (46认同)
  • 我可以通过`LANG = C sed -i's/[\ d128-\d255] // g'FILE避免"无效的校对字符"错误 (25认同)
  • @Sujit:没有更好的解决方案.我只想指出仍然创建了一个中间文件.有时这很重要.我只是不希望你假设它正在做*字面上*到位. (4认同)
  • 这个答案是错误的,应该删除. (3认同)
  • 我通过在 sed 调用前添加“LC_ALL=C”前缀来修复“无效排序字符”错误。 (2认同)

jca*_*314 15

sed -i 's/[^[:print:]]//' FILENAME
Run Code Online (Sandbox Code Playgroud)

此外,这就像dos2unix

  • 不行.[:print:]与ASCII不同.有许多可打印的非ASCII字符. (11认同)

Kat*_*age 15

我尝试了所有解决方案,没有任何效果.但是,以下内容:

tr -cd '\11\12\15\40-\176'
Run Code Online (Sandbox Code Playgroud)

我在这里找到的:

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

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


Viv*_*vek 10

尝试tr而不是sed

tr -cd '[:print:]' < file.txt
Run Code Online (Sandbox Code Playgroud)

  • OP特别提到他不想使用tr(因为他想要一个"就地"转换,其中sed -i假装是 - 真正写入临时文件并在幕后重命名).所以这个答案对OP没有帮助.但是......对于那些想要使用tr的人,你可能想要保留换行符(这里显示的20180228版本没有).然而,一个简单的调整会保留换行符和回车符:`tr -cd'[:print:] \n\r'<file.txt` (3认同)

Nic*_*oul 7

# -i (inplace)

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

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

基于伊万的回答和帕特里克的评论。


小智 6

这为我工作:

sed -i 's/[^[:print:]]//g'
Run Code Online (Sandbox Code Playgroud)


ACK*_*low 5

我使用的是非常少的busybox系统,在其中不支持trPOSIX字符类中的范围,因此我必须采用笨拙的老式方法。这是的解决方案sed,从文件中剥离所有不可打印的非ASCII字符:

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