Vim:删除匹配的大括号和大括号中的第一个单词

时间:2013-03-08 20:57:03

标签: regex vim latex

例如,更改

  

text 12345 {\ color {red} text 123 \ ref {label} 567

     

1234} 567

  

text 12345 text 123 \ ref {label} 567

     

1234 567

vim应该做什么样的操作?

我的目标是找到所有模式{\color{red} 并删除模式和模式匹配的大括号}, 同时保持文本介于两者之间。 模式{\color{red}可以在行中的任何位置(不一定在行的开头)。 {\color{red} ...}之间的文字可以有多行,如上所示。

非常感谢你的帮助。

修改: 我只想找到一种方法,但可能效率不高。

:g/\\color{red}/norm ndiBvaBpd% 

g:全球
/\\color{red}:匹配模式
/norm:正常模式命令
n:将光标转移到光标的下一个匹配模式。但如果模式位于该行的开头,则可能无法找到它 diB:从光标中删除内部块 vaB:选择光标周围的块 p:放到选定的块中 d%:删除\color{red}

2 个答案:

答案 0 :(得分:3)

没有得到你真正的意思。有很多方法可以做到。

{\color{red}text 123 \ref{label} 567}
^
|cursor
你可以这样做: d f } $ x

如果你安装了surround.vim,删除周围的括号会更容易。 (ds{

修改

更新问题:

打开您的文件,然后输入:

:g#{\\color{red}#normal 0df}$x

希望命令符合你的要求。

EDIT II 基于问题更新

如果你的目标文本对象是跨行,你可以试试这个:

g/{\\color{red}/normal 0f{mz%x`zxdf}
如果你的目标模式跨越多行(不仅仅是一两个,可能很多),

以上行就可以工作。但是语法必须正确,这意味着{ , } 必须配对

答案 1 :(得分:2)

我会使用正则表达式替换:

%s/\v\{\\color\{\w+\}(.*)} ?$/\1

\v非常神奇(理智的正则表达式)

{\\color\{\w+\}颜色不错

(.*)捕获您要保存的文字

} ?$关闭乳头支架和线末端的可选空间

/\1用第一个捕获替换整个东西,这是颜色标记BS

之间的东西

对于已修改的示例,您可以使用\_.代替.,因为它包含换行符。

%s/\v\{\\color\{\w+\}(\_.*)}/\1