Vim 如何快速地将`\norm{some string}`替换为`\\\;some string\\\\\\``呢?

Vim 如何快速地将`\norm{some string}`替换为`\\\;some string\\\\\\``呢?,vim,replace,Vim,Replace,我正在用vim编辑一个降价文件。此文件存在多个字符串\norm{some string}。我想用“一些字符串”来代替它们。有什么捷径吗?非常感谢 中的答案不能回答我的问题。它只是谈论一般更换一条线和多条线。在这里,我想替换一个环绕物,并将字符串保留在环绕物中 您要寻找的是所谓的捕获组和反向引用。如果内部没有嵌套的表单,大括号本身并不意味着有问题,并且表单跨越多行,那么快速的解决方案可能是:%s/\\norm{\.\\}/\\\\\\\\1\\\\\\/g 替换部分中的\1表示由\.*\捕获的组,

我正在用vim编辑一个降价文件。此文件存在多个字符串\norm{some string}。我想用“一些字符串”来代替它们。有什么捷径吗?非常感谢


中的答案不能回答我的问题。它只是谈论一般更换一条线和多条线。在这里,我想替换一个环绕物,并将字符串保留在环绕物中

您要寻找的是所谓的捕获组和反向引用。如果内部没有嵌套的表单,大括号本身并不意味着有问题,并且表单跨越多行,那么快速的解决方案可能是:%s/\\norm{\.\\}/\\\\\\\\1\\\\\\/g


替换部分中的\1表示由\.*\捕获的组,即最外面一对花括号内的原始内容。有关详细信息,请参见例如。

您也可以使用宏来完成所需的操作

将光标放在具有要替换的图案的第一行上。然后开始录制宏:

qq0ldwr|$xi\|ESCjq
意思是:

qq  = start recording a macro (q) in register q
0   = move to the beginning of the line
l   = move one char to the right
dw  = delete the word
r|  = substitute what is under the cursor with a "|"
$   = move to the end of line
x   = delete last char of the line
i   = insert mode
\|  = insert chars "\|"
ESC = exit insert mode
j   = move to next line
q   = stop recording
使用以下命令执行宏:

@q
再次执行宏:

@@
根据需要多行操作,或使用:

<number>@@
ex. 100@@

执行宏的次数。

some字符串可能包含一些括号对{}。感谢您的回复。这个回答可以部分回答我的问题。在我的例子中存在一些{},例如。.\norm{A^{-1}。@HuayiWei他正在给你提供资源,让你找到你需要的东西,自己去弄清楚怎么做,他不会给你确切的正则表达式。@StunBrick谢谢你的建议。@HuayiWei抱歉,这是一个拼写错误,并不意味着有问题。如果您尝试它,您可以看到它与您的示例一起工作,结果将是\|A^{-1}\。此正则表达式无法处理的情况是,例如。\norm{…\norm{…},但您可以执行多轮:。如果您有任意级别的嵌套,那么实际上一个简单的正则表达式表单根本无法处理这个问题,因为您需要某种形式的递归。请参见以下示例:。