我有一个看起来像这样的输入文件,我正在尝试使用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的问题吗?谢谢。
答案 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