Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在shell提示符中键入^@_Bash_Shell_Sh - Fatal编程技术网

Bash 如何在shell提示符中键入^@

Bash 如何在shell提示符中键入^@,bash,shell,sh,Bash,Shell,Sh,我需要删除文件列表中显示为^@的所有控制字符 在VI编辑器模式下,要键入控制字符^@我们需要按CTRL+V+@ 但在shell提示符中,这一点不起作用。 请帮我做这个 注意:我在Debian linux机器上进行了尝试。您在Vim中看到的是空字节,即数值为零的字节 您可以通过将光标放在^@的顶部并键入ga来检查。这将显示光标下字符的数值 如果需要从文件中删除该字符的所有匹配项,可以使用sed,并且根本不需要为此键入^@,因为sed至少是GNU版本,而不是BSD版本。。。支持十六进制值的不同表示法

我需要删除文件列表中显示为^@的所有控制字符

在VI编辑器模式下,要键入控制字符^@我们需要按CTRL+V+@ 但在shell提示符中,这一点不起作用。 请帮我做这个


注意:我在Debian linux机器上进行了尝试。

您在Vim中看到的是空字节,即数值为零的字节

您可以通过将光标放在^@的顶部并键入ga来检查。这将显示光标下字符的数值

如果需要从文件中删除该字符的所有匹配项,可以使用sed,并且根本不需要为此键入^@,因为sed至少是GNU版本,而不是BSD版本。。。支持十六进制值的不同表示法:

sed "s/\x00//g" file.txt
这将把file.txt的内容打印到stdout,所有零字节都被删除。如果您想在适当的位置删除字节,请小心,这会对您的原始文件和1造成危险!,使用-i选项:

1检查并重新列出警告上的注释:您将丢失文件创建日期,您需要确保它确实是您正在处理的文件,而不是符号链接

为了完整性,您当然可以在不离开Vim的情况下删除零字节

:%s/<ctrl-v>x00//g
:命令模式 %范围:完整文件 搜索/搜索 逐字的 十六进制 00零 /替换为。。。 /…没什么 g每行全局多次
当然,所有这些都是假设您没有查看UTF-16文件,只是被其中的零字节弄糊涂了。如果是这样,@IgnacioVazquez Abrams暗示当然是更好的方法:iconv-f UTF-16-t UTF-8 file.txt。但是,Vim首先不应该向您显示^。

您在Vim中看到的是空字节,即数值为零的字节

您可以通过将光标放在^@的顶部并键入ga来检查。这将显示光标下字符的数值

如果需要从文件中删除该字符的所有匹配项,可以使用sed,并且根本不需要为此键入^@,因为sed至少是GNU版本,而不是BSD版本。。。支持十六进制值的不同表示法:

sed "s/\x00//g" file.txt
这将把file.txt的内容打印到stdout,所有零字节都被删除。如果您想在适当的位置删除字节,请小心,这会对您的原始文件和1造成危险!,使用-i选项:

1检查并重新列出警告上的注释:您将丢失文件创建日期,您需要确保它确实是您正在处理的文件,而不是符号链接

为了完整性,您当然可以在不离开Vim的情况下删除零字节

:%s/<ctrl-v>x00//g
:命令模式 %范围:完整文件 搜索/搜索 逐字的 十六进制 00零 /替换为。。。 /…没什么 g每行全局多次 当然,所有这些都是假设您没有查看UTF-16文件,只是被其中的零字节弄糊涂了。如果是这样,@IgnacioVazquez Abrams暗示当然是更好的方法:iconv-f UTF-16-t UTF-8 file.txt。但是,Vim首先不应该向您展示^@。

注意:有关就地编辑解决方案,请参阅最健壮的或。

^@用于在vi和cat-v的输出中表示NUL0x字节

如果需要从文件中删除实际的NUL字符,则无需键入^@;请改用tr-d“\0”:

tr-d'\0'<文件将打印包含所有NUL字符的文件内容。删除:

$ tr -d '\0' < file | cat -v
before NUL$
after NUL$
注:有关就地编辑解决方案,请参阅最健壮或最简单的解决方案。

^@用于在vi和cat-v的输出中表示NUL0x字节

如果需要从文件中删除实际的NUL字符,则无需键入^@;请改用tr-d“\0”:

tr-d'\0'<文件将打印包含所有NUL字符的文件内容。删除:

$ tr -d '\0' < file | cat -v
before NUL$
after NUL$
^@是空字节0x00。若要从文件中删除此文件,您可能希望使用正版编辑器,而不是创建临时文件然后将临时文件转换为原始文件的程序:您将失去所有权限、所有权和符号链接

以下是如何使用标准编辑器ed从文件中删除所有空字节:

ed -s file < <(printf ',s/\0//g\nw\nq\n')
^@是空字节0x00。若要从文件中删除此文件,您可能希望使用正版编辑器,而不是创建临时文件然后将临时文件转换为原始文件的程序:您将失去所有权限、所有权和符号链接

以下是如何使用标准编辑器ed从文件中删除所有空字节:

ed -s file < <(printf ',s/\0//g\nw\nq\n')

不,您必须先按Ctrl+V,然后按Ctrl+@。根据您的键盘图,这可能是一个挑战,例如,在法语键盘上,我们必须键入Ctrl+V,然后键入Ctrl+AltGr+a。对于那些对符号感到困惑的人,OP指的是空字节0x00-为什么要删除它们而不是使用iconv或类似工具重新编码文件?不,必须先按Ctrl+V,然后按Ctrl+@。根据你的钥匙图,这可能是一个挑战。
G在法语键盘上,我们必须键入Ctrl+V,然后键入Ctrl+AltGr+A。对于那些对符号感到困惑的人,OP指的是空字节0x00-为什么要删除它们,而不是使用iconv或类似工具对文件进行重新编码?@DevSolar我猜他的意思是我在回答中所说的:使用sed,您将失去所有权限、所有权和符号链接。@DevSolar我不会纠正这一点,我的陈述是关于不涉及真正编辑器的方法:这也包括显式mv,比如说tr方法,实际上非常好。关于sed-i:注意它不是由POSIX指定的,所以没有任何东西可以保证存在不能正确处理权限的实现;此外,我不确定sed-I如何处理ACL,但这超出了这个问题的范围。顺便说一句,我对你的答案投了赞成票。@mklement0是的,关于Debian的事情很糟糕,他们的默认编辑器也是nano。在新安装上要做的第一件事是sudo apt get install ed.@mklement0:我不知道ed的情况,但是vim会将ex作为别名安装到自己身上,如果以这种方式调用,则从ex模式开始。gniourf_gniourf:有什么特别的原因让你在ex模式下选择ed而不是vim?只是想知道,因为vim通常是我安装在新盒子上的第一件东西-D@DevSolar没有特别的理由选择ed而不是ex,只是对于这个任务来说,ex是过分的。无论如何,在ex中你会做:ex file<@DevSolar我想他是指我在回答中所说的:使用sed,你将失去所有权限、所有权和符号链接。@DevSolar我不会纠正这一点,我的声明是关于不涉及真正编辑器的方法:这也包括显式mv,比如说tr方法,实际上非常好。关于sed-i:注意它不是由POSIX指定的,所以没有任何东西可以保证存在不能正确处理权限的实现;此外,我不确定sed-I如何处理ACL,但这超出了这个问题的范围。顺便说一句,我对你的答案投了赞成票。@mklement0是的,关于Debian的事情很糟糕,他们的默认编辑器也是nano。在新安装上要做的第一件事是sudo apt get install ed.@mklement0:我不知道ed的情况,但是vim会将ex作为别名安装到自己身上,如果以这种方式调用,则从ex模式开始。gniourf_gniourf:有什么特别的原因让你在ex模式下选择ed而不是vim?只是想知道,因为vim通常是我安装在新盒子上的第一件东西-D@DevSolar没有特别的理由选择ed而不是ex,只是对于这个任务来说,ex是过分的。无论如何,在ex中,为了解释为什么BSD sed和任何POSIX features only实现无法做到这一点,请告诉我您是否知道一种方法:似乎,正则表达式中支持的唯一转义序列是\n-无法表示NUL。@mklement0:我目前无法访问BSD,但似乎在任何情况下,sed的AIX版本都只是删除了空字节,不管您的正则表达式是否匹配它们-要解释为什么BSD sed和任何POSIX features only实现无法做到这一点,请告诉我您是否知道一种方法:似乎正则表达式中支持的唯一转义序列是\n-无法表示NUL。@mklement0:我目前无法访问BSD,但似乎在任何情况下,AIX版本的sed都只删除空字节,您的正则表达式是否与它们匹配:-D