我有一个 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-^G
0x87 字节(八进制为 0207)。正如其文档1所说,在使用单字节字符集的语言环境中或在Unicode 且 ESA 字符被编码为有效的 UTF-8 多字节序列时vim
呈现字节 0x87 ,并在选项为 Unicode 且字符不构成有效 UTF-8 序列的一部分。 (它呈现0x7,即 ASCII BEL 字符。)~G
encoding
<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
显示非打印字符的选项。