我必须根据字符表替换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不要两次替换字符串的相同部分?或者哪个命令可以并行执行多个替换?
答案 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>