如何将所有大写单词更改为小写,但在Vim中排除字符串文字

时间:2012-03-17 21:13:39

标签: regex vim

我有一个相当长的sql脚本,其中所有关键字都是大写的。我想将它们更改为小写,但保留字符串文字和我自己的标识符的确切值 例如,在本文中:

KEYWORD BEFORE 'SOME STRING LITERAL' KEYWORD AFTER
mixedCaseValue  
MY_OWN_VARAIBLE
UGLY APPERCASE KEYWORDS, other text

我只想要'关键词'之前','关键字后'和最后'UGLY UPPERCASE KEYWORDS'为小写,其他所有保持完好。
如果我使用类似:%s/\<\u\+\>/\L&/g之类的内容,第一行引号内的文字也会受到影响。

你有什么想法吗?

3 个答案:

答案 0 :(得分:2)

一种方式:

:%v/'/s/\(^\|\s\)\@<=\u\+\(\s\|,\)\@=/\L&/g

说明:

%                      # Range: All file.
v/pattern/command      # Apply command to all lines that doesn't match pattern
'                      # The pattern, so apply substitution to lines that doesn't have it.
s/string/replacement/  # Replacement command.
\(^\|\s\)\@<=          # Zero-width preceding match: Beginning of line or a space.
\u\+                   # One or more alphabetic uppercase letters.
\(\s\|,\)\@=           # Zero-width positive match: Space or comma.
\L&                    # Lowercase the string matched
/g                     # Apply globally: Many times for each line.

结果:

'SOME STRING LITERAL'  
mixedCaseValue  
MY_OWN_VARAIBLE
ugly appercase keywords, other text

答案 1 :(得分:1)

假设字符串文字不跨越多行,并且存在 没有语法来转义字符串文字中的单引号,我会使用 以下替换命令。

:%s/\%(^\%([^']*'[^']*'\)*\)\@<=[^']\+/\=substitute(submatch(0),'\<\u\+\>','\L&','g')/g

答案 2 :(得分:1)

我内心充满爱的心灵诅咒写下这些,但是......

如果这是您不必经常做的事情,您可以通过在替换命令上附加c标志来强制它,以提示确认每个更改;你应该能够快速完成大量的脚本,如果你能忍受沉闷的话。这种方式(在短期内)可能比花时间制定一个好的替代命令更快。

或者,如果只有少数字符串文字需要不被触及,请将其更改为其他字符串,以便全局替换不会更改它们,执行全局替换,然后将其更改回来。也很粗但有效。

嗯,我觉得很脏。