【问题标题】:SED with "unmatched /" and odd behavior具有“不匹配 /”和奇怪行为的 SED
【发布时间】: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 风格”字符串。

标签: sed null


【解决方案1】:

$'string' 形式的单词被特殊处理。该词扩展为 字符串,用反斜杠转义字符替换为 ANSI C 标准。

发件人:http://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html

您应该尝试在您的模式中转义 \

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

【讨论】:

    【解决方案2】:

    shell 字符串中不能有 NUL 字节,因为它向底层 C 库发出字符串结束信号。使用正确处理字符串中的内部 NUL 字节的工具。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多