如何仅替换特定标记内的引号

时间:2018-06-01 05:33:54

标签: regex vim vi

如何仅替换部分引号并保留所有内容,请参阅下面的示例

<type>"sample"<type> 
<content>R.A.H.M.A.N. sample text."</content>

<type>"sample"<type>
<content>R.A.H.M.A.N. sample text.</content>

仅替换content标记内的引号,是否可以?

2 个答案:

答案 0 :(得分:0)

如果所有<content>标记都在一行上,您可以使用:g命令:

:g=<content>.*</content>=s="==g

这将替换包含打开和关闭<content>标记的所有行的所有引号。 (这并不一定意味着这些引号位于<content>标记内。)

请参阅:help global

答案 1 :(得分:0)

:%s!<content>\zs\_.\{-}\ze</content>!\=substitute(submatch(0), '"', '', 'g')!g

这个想法是:

  • 在所有行上运行替换命令,并在一行中对所有匹配执行::%s!...!...!g
  • 搜索<content>,然后搜索0个或更多字符(尽可能少),然后搜索</content>:`_。{ - }
  • ...但是分别在<content>之后和匹配结束之前设置匹配的开始</content><content>\zs...\ze</content>
  • 这意味着我们不会替换<content></content>部分本身,只会替换内容。
  • 将其替换为运行表达式的结果:\=
  • 表达式为substitute(submatch(0), '"', '', 'g')
    • 获取目前为止匹配的文字:submatch(0)
    • 搜索所有"并将其替换为空:substitute(..., '"', '', 'g')