如何在vi中用特定模式替换一行?

如何在vi中用特定模式替换一行?

我正在尝试将包含该模式的行替换"s#_decoded_block[""s#_decoded_block_".我用来执行此操作的命令是

%s/s\d\+_decoded_block\[/s\d\+_decoded_block_/g

我希望得到"s#_decoded_block_"替补,但我却得到了"sd+_decoded_block_"。请让我知道我做错了什么。

答案1

您似乎期望问题中的“#”为十进制数。您可以使用反向引用来做到这一点:

%s/s\(\d\+\)_decoded_block\[/s\1_decoded_block_/g

其中\(\d\+\)匹配一个或多个十进制数字并使用标记替换\1

您可以通过移动其中的更多文本来改进反向引用:

%s/s\(\d\+_decoded_block\)\[/s\1_/g

因为\1将被组中匹配的任何内容替换。

答案2

不确定它是否完全适合您的用例,但看起来您也可以使用:

:g/s\d\+_decoded_block\[/ s/\[/_/

...除非有其他潜在的[...除非匹配行中你想要改变的那个。

越简单越好,如果它符合您的要求。

相关内容