【问题标题】:How to add zeros between hex numbers with sed/awk?如何使用 sed/awk 在十六进制数之间添加零?
【发布时间】:2019-10-27 22:06:20
【问题描述】:

我的文件包含该字符串

    abc = <0x12345678>;
    abc = <0x01234 0x56789>;
    abc = <0x123 0x456 0x789>;
    abc = <0x0 0x01234 0x0 0x56789>;
    abc = <0x012 0x345>, <0x678 0x901>;
    def = <0x12345 0x67890>;

我需要将其转换为文件包含

    abc = <0 0x12345678>;
    abc = <0 0x01234 0 0x56789>;
    abc = <0x123 0x456 0x789>;
    abc = <0x0 0x01234 0x0 0x56789>;
    abc = <0 0x012 0 0x345>, <0 0x678 0 0x901>;
    def = <0x12345 0x67890>;

所以如果字符串以 'abc = ' 开头,我需要在十六进制数字之前添加零,在两个三角括号之间不超过 2 个十六进制数字并且没有 0x0 在该 HEX 数字之间。如何使用 sedawk 或其他 bash 工具来做到这一点?

【问题讨论】:

  • 文件是否可以包含 abc = &lt;0x012 0x345&gt;, &lt;0x678 0x901 0x010&gt;; 这样的行? (具有不同十六进制数的组)
  • 只有相同数量的十六进制数的组
  • 条件 HEX 数字之间没有 0x0 已经被前面的规则 覆盖 不超过 2 一对三角括号之间的十六进制数
  • @CasimiretHippolyte:前导空格are intended
  • abc = &lt;0x0 0x1234&gt; 可能吗?

标签: bash awk sed


【解决方案1】:
sed '/abc = </{/<[^ >]* [^ >]* /!s/0x/0 &/g}'

解释:

/abc = </{/<[^ >]* [^ >]* /!s/0x/0 &/g}
/abc = </                                Operate on lines containing "abc = <"
         {                            }  Group the commands together
                           !             Negate the condition
          /<[^ >]* [^ >]* /              Match if lines contain more than two elements after <
                            s/0x/0 &/    Prepend "0 " to "0x"
                                     g   Globally, i.e. replace as many times as possible

【讨论】:

  • 几乎工作。 sed '/abc = &lt;/{/&lt;[^ &gt;]* [^ &gt;]* /!s/0x/0 &amp;/g}; s/abc = &lt;0 0x0 0/abc = &lt;0x0/g; s/abc = &lt;0 0x0&gt;/abc = &lt;0x0&gt;/g' 帮助了我。谢谢!
猜你喜欢
  • 2011-06-04
  • 2013-05-31
  • 2015-02-04
  • 2010-09-09
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
相关资源
最近更新 更多