删除垃圾字符~G

chi*_*Das 3 text-processing

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

在此处输入图片说明

453136~G|OORAHASS0343136~G|通用盒接入~G|NMBLDD~G|/shelf=0/slot=1/port=7~G|20Mbit/s~G|80Mbit/s~G|IS

如何删除 ~G 字符。

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

sed -e 's/[^ -~]//g' file_in > file_out
Run Code Online (Sandbox Code Playgroud)

或者

grep -c '[^ -~]' file_in 
Run Code Online (Sandbox Code Playgroud)

或者

sed -i 's/\~H//g;s/\~G//g' file_in
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 11

cat -e将它们渲染为M-^G建议的 0x87 字节(八进制为 0207)。由于其文档1表示,vim渲染字节0x87,因为~G当使用单字节CharSet或encodingunicode时,何时在Locees和ESA字符被编码为有效的UTF-8多字节序列时,并且将字节呈现为何<87>encoding选项是Unicode何时选择字符不构成有效 UTF-8 序列的一部分。(它呈现^G为 0x7,即 ASCII BEL 字符。)

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

要摆脱它,您可以执行以下操作:

tr -d '\207' < file > file.new
Run Code Online (Sandbox Code Playgroud)

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

sed -i $'s/\207//g' file
Run Code Online (Sandbox Code Playgroud)

您的

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

本来可以做到的,但仅限于 C 语言环境。在其他语言环境中匹配的字符范围是非常随机的。所以:

LC_ALL=C sed 's/[^ -~]//g' < file > file.new
Run Code Online (Sandbox Code Playgroud)

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

0x87 在 windows-1252 字符集中是 ‡(有时被不恰当地称为 latin1 或 iso8859-1)。

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

iconv -f windows-1252 < file > file.new
Run Code Online (Sandbox Code Playgroud)

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