0

我有一个包含以下地址的文件:该文件中
0x0003ffff
0x0003ffff
0x0000ffff
0x0000ffff
0x003fffff
0x05ffffff
0x3fffffff
0x000000ff 可以有“n”个这样的地址,我希望将地址更改为

0x0003FFB0
0x0003FFB0
0x0000FFB0
0x0000FFB0
0x003FFFB0
0x05FFFFB0
0x3FFFFFB0
0x000000B0 对于所有“n”个地址。我基本上想要的是将最后 2 个 'ff' 更改为 'B0' 并将剩余的 'f' 更改为 'F' 我如何使用 bash 脚本来做到这一点?

4

3 回答 3

1

使用 sed:

sed --in-place 's/\(0x000[0-9]\)ffff/\1FFB0/' file

首先在没有标志的情况下尝试它,--in-place以确保它是您想要的。

如果像 Nikhilesh Sharma 指出的那样,您的 F 可能比您的问题中指出的更多,您可以使用以下内容。我假设你有 GNU sed。如果这不起作用,请告诉我,我会给你更长但对 posix 友好的版本。

sed --in-place 's/\(0x[0-9f]\{6\}\)ff/\U\1B0/' file

这是一个很好的教程,可以在 sed 上剪牙。

于 2012-05-10T03:06:02.827 回答
0

假如说:

  1. 您的输入文件称为 input.txt
  2. 所有地址都从第 1 列开始
  3. 你想保留前 8 个字符
  4. 所有地址都以 ff 结尾

那么这可以工作(至少它适用于您的输入):

cat input.txt | cut -b1-8 | tr f F | sed s/$/B0/g
于 2012-05-10T03:27:11.713 回答
0

如果您有 gawk,请使用数字操作而不是字符串操作

gawk '
  {n = strtonum($1)} 
  (n % 0x100) == 0xff {printf("0x%08X\n", n - 0x4f)}
'
于 2012-05-10T13:33:30.387 回答