忽略Vim Regex替换中引号中的关键字

时间:2014-10-26 05:00:10

标签: regex vim

我想用“AS”替换我的SQL脚本中的“as”,但我想忽略那些带双引号的内容。

例如,在以下4个案例中:

  1. if(something = "something", "true", "false") as[1] test
  2. if(something = "something", "something as[2] something", "is not") test
  3. if(something = "something" and everything = "everything", "true", "false") as[3] test
  4. if(something = "something", "something as[4] something", "is not") as[5] test
  5. 我正在尝试编写一个替换[1],[3]和[5]的正则表达式替换,但不是[2]和[4]。

    我尝试了消极的看法,但无济于事。

    欢迎任何建议!谢谢!

4 个答案:

答案 0 :(得分:1)

执行此类操作的标准方法是根据语法组执行搜索和替换。有可用的插件SrchRplcHiGrp.vim,但您也可以手动执行此操作。

在您的情况下,将光标放在" as"要替换并记下它所属的语法组: :echo synIDattr(synID(line('.'),col('.'),1), 'name')这将显示光标下对象的语法名称。对于sql语法,这应该显示 sqlKeyword 。知道了这一点,您可以使用:s这样的命令替换:

:%s/as/\=synIDattr(synID(line('.'),col('.'),1),'name')==#'sqlKeyword'?toupper(submatch(0)):submatch(0)/g

基本上说,如果匹配的语法组" as"是sqlKeyword,将其设为大写,替换它自己。

答案 1 :(得分:0)

假设(大部分)' as'的实例您要替换的内容永远不会引号,您可以使用以下内容:

:1,$s/ as \([^"]\+\)$/ AS \1/

如果其中一些后跟引号,但大部分都没有,您可以在命令末尾添加c,让它确认每次更换,例如:

:1,$s/ as \([^"]\+\)$/ AS \1/c

答案 2 :(得分:0)

PatternsOnText plugin的最新版本1.40有一个:SubstituteNotInSearch命令。这样,您可以仅在双引号之外用as大写:

:%SubstituteNotInSearch/"[^"]\+"/\<as\>/AS/g

答案 3 :(得分:0)

我可以给你一个解决方案,但这是有史以来最糟糕的^^

享受

:'<,'>s/\"\zs\(\w\)/<\1/g | '<,'>s/\(\w\)\ze\"/\1>/g | '<,'>s/<.\{-}>/\=substitute(submatch(0),"as","<as>","g")/g | '<,'>s/as\[/ AS[/g | '<,'>s/[<>]//g