使用 sed 反向引用

使用 sed 反向引用

我有一个数据库,其中包含表示一堆内存地址的无符号长整型列表,后跟两个括号内的偏移量(例如Mem[offset]0x2322AD4[3])和一些其他数据。我想要实现的目标是通过用单个空格替换左括号并去掉右括号来将偏移量与内存地址分开。我正在采取的程序如下:

  1. 找到后面跟着一个左括号的每个数字(这是因为我的其他数据可能包含一个不应弄乱的括号)。
  2. 仅将括号替换为一个空格。
  3. 找到后跟右括号的每个数字,并且仅将右括号替换为一个空格。

可以使用以下两个命令轻松处理括号:

sed 's/\[/ /' #replace the opening bracket with a single space.

sed 's/\]//' #delete the closing bracket

但同样,我不想弄乱数据库中存储的其他数据。

我的第二个猜测是使用反向引用来处理这项工作。是否可以sed找到每个数字后跟左大括号并反向引用该数字并在其后面添加一个空格,结果如下:

0x2322AD4 3]

那么我可以继续使用上面提到的第二个命令来去掉右大括号吗?

如果有完全不同的方法来解决问题,请发帖。

答案1

我认为您正在寻找的是这样的:

sed -r 's/(0[xX][[:xdigit:]]+)\[([[:digit:]]+)\]/\1 \2/g'

例如:

$ sed -r 's/(0[xX][[:xdigit:]]+)\[([[:digit:]]+)\]/\1 \2/g' <<EOF
> mem+offset: 0x2322AD4[3]  0x232BEEF[12]
> unchanged: 0x22343AF word[2] 7E[word]
> EOF

mem+offset: 0x2322AD4 3  0x232BEEF 12
unchanged: 0x22343AF word[2] 7E[word]
$

注意:如果没有 0[xX],它将认为 d[2] 在第二个输入行中是可替换的。

答案2

我能够弄清楚。以下是未来访问该问题的答案:

sed -r 's/(0[Xx][A-Fa-f0-9]+)\[([0-9]+)\]/\1 \2/g'

相关内容