【问题标题】:find and replace exact matching hex on multiple lines在多行上查找并替换完全匹配的十六进制
【发布时间】:2016-05-15 00:04:04
【问题描述】:

enter image description here

0070  41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 34
0080  2e 30 20 28 63 6f 6d 70 61 74 69 62 6c 65 3b 20

我正在尝试找到一种方法来查找/匹配模式

2f 34 2e 30 20 28 63 6f

替换成

2f 35 2e 30 20 28 68 63

问题是这种模式可以用许多不同的方式分成两条线,例如2f 34 2e 30 20 可以在第一行的末尾,然后是下一行的其余模式。我想学习如何找到替代其他(更大)模式的方法。

此代码仅在模式完全包含在一行中时才有效。

# replace hex equivalent of "/4.0 (co" with "/5.0 (hc" in hex field
sed 's/2f 34 2e 30 20 28 63 6f/2f 35 2e 30 20 28 68 63/g' <MPFADT$var.txt >>MPFADT$new.txt"

我玩过 awk 和 sed,但无济于事。我也看过 perl 的例子。

我很确定我可以摆脱偏移,但是,这需要合并,这会破坏格式...

awk -F'  ' ' {print " "$2 > file} MPFADT$var.txt

【问题讨论】:

    标签: bash perl awk sed


    【解决方案1】:

    十六进制代码可以通过用于生成十六进制转储的工具使用多行打印,但原始文件中包含的十六进制字符串不会“分解”为多行。我的意思是如果“2f 34 2e 30 20 28 63 6f”在某处包含一个新行......这将是一个不同的十六进制序列。

    也就是说,我认为你可以只使用 sed:

    $ sed 's/\x2f\x34\x2e\x30\x20\x28\x63\x6f/\x2f\x35\x2e\x30\x20\x28\x68\x63/' your_file
    

    【讨论】:

      【解决方案2】:

      这是一种不关心字符串要替换多长时间或分割多少行的方法:

      $ cat tst.awk
      {
          keys[NR] = $1
          sub(/^[^[:space:]]+[[:space:]]+/,"")
          buf = (NR>1 ? buf FS : "") $0
      }
      END {
          gsub(old,new,buf)
          for (i=1; i<length(buf); i+=(NF*3)) {
              print keys[++nr] "  " substr(buf,i,(NF*3)-1)
          }
      }
      
      $ awk -v old="2f 34 2e 30 20 28 63 6f" -v new="2f 35 2e 30 20 28 68 63" -f tst.awk file
      0070  41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35
      0080  2e 30 20 28 68 63 6d 70 61 74 69 62 6c 65 3b 20
      

      它确实将整个文件读入内存,如果这对你来说是个问题,我想知道。如果是,您可以将buf 定义为某个最大大小并编写代码以通过FIFO 旋转所有输入行,每次buf 更改时执行gsub(),但这会更复杂且效率更低,而且您然后必须考虑第二个gsub() 可能在由第一个gsub() 修改的数据上运行,而不是在原始数据上运行。

      【讨论】:

        【解决方案3】:

        这是一种方法。首先使用xxd纯格式 转储文件,这将抑制左侧的地址。现在删除所有换行符,这样任何东西都不能跨越多行,因为您的文件现在是一长行,然后不受惩罚地进行替换,并再次使用xxd 重建。描述比描述需要更长的时间!

        xxd -p input.bin | tr -d '\n' | sed 's/2f342e302028636f/2f352e3020286863/g' | xxd -r -p - patched.bin
        

        您最好使用 GNU sed,因为它对行长没有限制。

        【讨论】:

          【解决方案4】:

          这可能对你有用(GNU sed):

          sed -r 'N;s/2f(\n....  | )34(\n....  | )2e(\n....  | )30(\n....  | )20(\n....  | )28(\n....  | )63(\n....  | )6f/2f\135\22e\330\420\528\668\763/;P;D' file
          

          保持两行和模式匹配的运行窗口。由于该模式可能出现在输出中的任何位置,因此可以通过在每对符号之间提供替代模式来实现这一点。

          注意您的成功可能有限,因为分页可能会扰乱苹果车。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-12-11
            • 2016-01-23
            • 2019-02-27
            • 2016-08-07
            • 2012-12-06
            • 2016-01-30
            • 2021-09-09
            相关资源
            最近更新 更多