我有一个相当长的sql脚本,其中所有关键字都是大写的。我想将它们更改为小写,但保留字符串文字和我自己的标识符的确切值 例如,在本文中:
KEYWORD BEFORE 'SOME STRING LITERAL' KEYWORD AFTER
mixedCaseValue
MY_OWN_VARAIBLE
UGLY APPERCASE KEYWORDS, other text
我只想要'关键词'之前','关键字后'和最后'UGLY UPPERCASE KEYWORDS'为小写,其他所有保持完好。
如果我使用类似:%s/\<\u\+\>/\L&/g
之类的内容,第一行引号内的文字也会受到影响。
你有什么想法吗?
答案 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
标志来强制它,以提示确认每个更改;你应该能够快速完成大量的脚本,如果你能忍受沉闷的话。这种方式(在短期内)可能比花时间制定一个好的替代命令更快。
或者,如果只有少数字符串文字需要不被触及,请将其更改为其他字符串,以便全局替换不会更改它们,执行全局替换,然后将其更改回来。也很粗但有效。
嗯,我觉得很脏。