如何替换多个模式而不在hex文件上相互踩? (sed / awk或任何其他命令)

时间:2015-05-28 00:39:23

标签: regex bash shell awk sed

我必须根据字符表替换hex文件中的一些字符。为了简化问题,我们说我有这样的意见:

0x1A 0x44 0x2C

我的表说:

0x1A=K
0X44=u
0X2C=?

所以预期的结果将是' Ku?'没有引号。

如果我运行此命令

cat file.hex | sed 's/\x1A/K/g;\x44/u/g;\x2C/?/g'

我明白了吗?而不是Ku ?,因为第三个sed命令超过了第一个。在这种情况下,我可以重新排序它们,但我必须做大约40个命令,并且没有任何顺序不会重叠。

如何让sed不要两次替换字符串的相同部分?或者哪个命令可以并行执行多个替换?

3 个答案:

答案 0 :(得分:3)

使用GNU sed:

sed 'y/\x1A\x44\x2C/Ku?/' file

答案 1 :(得分:1)

这是一个简单易懂的解决方案,仅使用ASCII的Bash数组

declare -a tbl
tbl[0x1A]=K
tbl[0X44]=u
tbl[0X2C]=?

while read line; do
  for c in $line; do
    let r=c
    echo -n "${tbl[$r]}"
    done
  echo 
done < file.hex

对于二进制替换,请考虑tr。这是想法

tr '\032D,' Ku? < file.binary

答案 2 :(得分:1)

通用解决方案是拥有映射表。然后只需执行一次全局替换,其中映射表中的每个字符串都将替换为其映射。

perl -pe 'BEGIN { %map = ("\x1A"=>"K", "\x44"=>"u", "\x2C"=>"?");
        $k = join("|", keys %map); }
    s/($k)/$map{$1}/g'

如果您有不同长度的重叠字符串,您需要确保长字符串位于$k中的短字符串之前,但是对于这个简单的演示,我只是加入它们而不考虑排序。< / p>