【发布时间】:2016-06-02 20:22:47
【问题描述】:
我有一个看起来像这样的输入文件,我正在尝试使用 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 空值中找到期望。有人可以向我解释为什么会发生这种情况,如果可能的话如何解决?莫巴有问题吗?谢谢。
【问题讨论】:
-
你为什么要在图案前面加上
$? -
它应该可以在没有
$的情况下工作:sed -e 's/\x00/\x040/g' testsed.txt。 -
没有 $ 它根本不做任何转换。这就是我首先使用 $ 的原因,因为由于某种原因,没有它它无法扩展 Moba 上的十六进制数字。
-
@Kenavoz - 模式开头的
$使其成为格式扩展,适用于许多外壳程序。没有它,由sed来解释特殊字符。 GNU sed 对 printf 扩展有一些支持,但它并不完整,即便如此,GNU sed 仅默认包含在有限数量的操作系统中。最好有一个更便携的解决方案。 -
@DmitriChubarov 这是一个 Bash“C 风格”字符串。