删除垃圾字符~G

删除垃圾字符~G

我有一个 unix csv 文件作为管道“|”分隔器 。但是,当我在 vi 编辑器中打开时,会有一些额外的字符以 ~G 形式出现。但是当我做 cat 时,我看不到任何 ~G 字符。

在此输入图像描述

453136~G|OORAHASS0343136~G|通用盒接入~G|NMBLDD~G|/架=0/插槽=1/端口=7~G|20Mbit/s~G|80Mbit/s~G|IS

如何删除 ~G 字符。

我已经尝试过以下步骤,但没有运气。

sed -e 's/[^ -~]//g' file_in > file_out

或者

grep -c '[^ -~]' file_in 

或者

sed -i 's/\~H//g;s/\~G//g' file_in

答案1

cat -e将它们渲染为M-^G0x87 字节(八进制为 0207)。正如其文档1所说,在使用单字节字符集的语言环境中或在Unicode 且 ESA 字符被编码为有效的 UTF-8 多字节序列时vim呈现字节 0x87 ,并在选项为 Unicode 且字符不构成有效 UTF-8 序列的一部分。 (它呈现0x7,即 ASCII BEL 字符。)~Gencoding<87>encoding^G

G(ASCII 中的 0x47),第 7 位(元)设置为 1,第 6 位设置为 0(控制)。该字节不构成 UTF-8 中的有效字符,通常是控制字符的代码 (ESA) 在 ISO8859-x 字符集中的 C1 集中。

要摆脱它,你可以这样做:

tr -d '\207' < file > file.new

使用 GNUsed和像 ksh93/zsh/bash 这样的 shell,支持$'...'

sed -i $'s/\207//g' file

你的

sed 's/[^ -~]//g'

本来可以做到这一点,但只能在 C 语言环境中。在其他语言环境中匹配的字符范围是相当随机的。所以:

LC_ALL=C sed 's/[^ -~]//g' < file > file.new

(请注意,它将删除所有其他控制字符,包括制表符和 CR(但不包括 LF)和非 ASCII 字符)。

0x87 是 windows-1252 字符集中的 ‡(有时被错误地称为 latin1 或 iso8859-1)。

如果您希望将这些 0x87 转换为您语言环境的字符集中的 ‡(因为例如这些文件来自 Windows 世界,这就是那些 0x87 的目的)(假设它具有这样的字符),您可以使用:

iconv -f windows-1252 < file > file.new

1 布拉姆·穆勒纳尔 (2011-03-22)。 '是印刷'。 “选项”。VIM 参考手册

答案2

仅使用 coreutils 中的工具:

# Generate a test file
printf 'head\207\nsome text\207\nnew line' > /tmp/test.cchar

# And filter with tr
tr -d "\207" < /tmp/test.cchar > /tmp/test.filtered 

答案3

~G是一个响铃字符,ASCII 007。删除它并就地更新文件的简单方法是:

perl -pi -e 's/\007//' file_in

另请参阅ASCII 表

一个更复杂的sed解决方案是使用 shell 替换:

sed -i 's/'`echo "\007"`'//' file_in

使用时cat,添加-e显示非打印字符的选项。

相关内容