SED具有“无与伦比的”和奇怪的行为

时间:2016-06-02 11:30:29

标签: sed null

我有一个看起来像这样的输入文件,我正在尝试使用sed进行一些转换:

原始档案:

DATA: gt_alv LIKF zfica_paym_cancel_alv OCCURS 0 WITH HFADFR LINF.
DATA: gt_out LIKF zfica_paym_cancel_out OCCURS 0 WITH HFADFR LINF. 

我想根据十六进制值清理一些字符,但我从框中得到一个奇怪的行为。 (跑在MobaXterm)

当我跑步时:

sed -e $'s/\x20/\x040/g' testsed.txt

输出是:

DATA:0gt_alv0LIKE0zfica_paym_cancel_alv0OCCURS000WITH0HEADER0LINE.
DATA:0gt_out0LIKE0zfica_paym_cancel_out0OCCURS000WITH0HEADER0LINE.

它按预期工作。但是当我尝试达到空值x00时,我得到以下错误:

sed -e $'s/\x00/\x040/g' testsed.txt

产生:

sed: unmatched '/'

我尝试了各种组合。以八进制形式提供ascii代码根本不起作用。但十六进制数只能从/ x00 null中找到。有人可以向我解释为什么会发生这种情况,如果可能的话,如何解决它?这是Moba的问题吗?谢谢。

2 个答案:

答案 0 :(得分:2)

  

$' string'形式的单词特别对待。这个词扩展到了   字符串,替换为反斜杠转义字符   ANSI C标准。

来自:http://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html

您应该尝试逃避模式中的\

sed -e $'s/\\x00/\x040/g' null.txt 

答案 1 :(得分:0)

你根本不能在shell字符串中有一个NUL字节,因为它将字符串结束信号发送到底层C库。使用一个正确处理字符串中内部NUL字节的工具。

perl -pe 's/\x00/\x40/g' testsed.txt