在Unix文件中删除^@字符

6
我有一个关于删除不可见字符的问题,这些字符只能在使用“vi”命令查看文件时才能看到。我们有一个由Datastage应用程序生成的文件(源是DB2表,目标是.txt文件)。文件包含具有不同数据类型的数据。我只有3个列的问题,它们的数据类型定义为CHAR。
如果您在Textpad中打开文件,您会看到空格。但是当您通过Unix的vi命令查看相同的文件时,我们会看到蓝色的^@字符。我的文件是一个分隔符文件,分隔符为^@^(我知道这听起来有点奇怪)。
我已经尝试过:
1. tr -d [:cntrl:] NewFileName — 仍然没有运气 — [分隔符被删除,但空格仍然存在]
2. tr -s "^@" NewFilename — 仍然没有运气 — 我看到文件大小减小,但是不可见字符仍然存在。
3. 尝试更改分隔符 — 但仍然看到相同的不可见字符。
4. 使用sed "s/^@/g/"(和其他sed命令) — 仍然没有运气。
非常感谢任何建议。我已经研究了这个网站上的帖子,但我找不到一个。如果这很简单,请原谅我并分享您的想法。
2个回答

8
vi中,NUL字符被表示为^@。要去除它们:

tr

使用tr,您可以按以下方式删除NUL字符:
tr -d '\000' < file-name > new-file-name

这被标记为“unix”,而不是“linux” - 只有给出的tr示例与“unix”标签有用。 - Thomas Dickey
@ThomasDickey 能否澄清一下?你的说法是否涵盖了所有版本的Unix? - Robby Cornelissen
尝试阅读POSIX描述。在“vi”中,您正在描述“vim”,而在“sed”中,您正在描述GNU实现。对于这些情况,两者都不遵循POSIX。您可能还可以加入Perl。 - Thomas Dickey
POSIX sed 不支持 '\x'。如果你要使用它,应该将标签更改为“linux”(不是“unix”)。普通的(没有控制修饰符)@不能被视为 POSIX。大多数终端(不是全部)都支持 control-@ (^@) 作为空值。 - Thomas Dickey
1
谢谢Robby,这个方法很有效,我的问题解决了。非常感谢你的时间。Thomas,你的建议也很有帮助,今天我学到了新东西。 - Manikanta G
显示剩余2条评论

1

使用vim打开文件,然后输入':'(不包括单引号),并粘贴以下内容:

%s/control + 2//g (在普通PC上)

%s/control + shift + 2 //g (在Mac PC上)

当然,需要使用你的键盘上的相应按键替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接