我想用“AS”替换我的SQL脚本中的“as”,但我想忽略那些带双引号的内容。
例如,在以下4个案例中:
if(something = "something", "true", "false") as[1] test
if(something = "something", "something as[2] something", "is not") test
if(something = "something" and everything = "everything", "true", "false") as[3] test
if(something = "something", "something as[4] something", "is not") as[5] test
我正在尝试编写一个替换[1],[3]和[5]的正则表达式替换,但不是[2]和[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