正则表达式查找并替换可能变化的字符

时间:2015-10-29 14:27:15

标签: regex sed

我试图在bash脚本中写一行,它接受所有推送和弹出寄存器的实例,并将其从32位寄存器更改为64位寄存器。例如,push ecx应该变为push rcx

唯一可以变化的字符是倒数第二个,所以使用e\wx查找工作正常,但我如何制作它以便保存\ w中的任何字符,以及哪个,推/弹的存在?唯一需要改变的角色是e到r。

总之,我有这个:

 sed -i -e "s/push eax/push rax/"
 sed -i -e "s/push ebx/push rbx/"
 sed -i -e "s/push ecx/push rcx/"
 sed -i -i "s/push edx/push rdx/"
 sed -i -e "s/pop eax/pop rax/"
 sed -i -e "s/pop ebx/pop rbx/"
 sed -i -e "s/pop ecx/pop rcx/"
 sed -i -i "s/pop edx/pop rdx/"

我想知道我是否可以在一行中完成

提前致谢!

2 个答案:

答案 0 :(得分:2)

使用捕获组:

sed -i -e "s/(push|pop) e(\w+)/\\1 r\\2/"

我没有方便的控制台,所以我无法测试它,你可以在这里看到Regex stub

答案 1 :(得分:2)

你走了:

sed -i 's/\(push\|pop\) r\([abcd]\)x/\1 e\2x/'

示例运行:

$ echo """push rax
push rbx
push rcx
push rdx
pop rax
pop rbx
pop rcx
pop rdx
nop""" | sed 's/\(push\|pop\) r\([abcd]\)x/\1 e\2x/'
push eax
push ebx
push ecx
push edx
pop eax
pop ebx
pop ecx
pop edx
nop