2012-03-17 41 views
1

我得到了比较长的sql脚本,其中all关键字都是大写。我想将它们改为小写,但保留字符串文字和我自己的标识符的确切值。
例如,在这样的文字:如何将所有的大写单词改为小写,但不包括Vim中的字符串文字

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

我只想要“关键字之前”,“关键字后”和过去的“丑陋的大写关键字”是小写和所有其他保持不变。
如果我使用类似:%s/\<\u\+\>/\L&/g的东西,第一行中引号内的文字也会受到影响。

你有什么想法吗?

+0

这是否有帮助,我不太确定你在这里需要什么 - http://vim.wikia.com/wiki/Switching_case_of_characters – Coffee 2012-03-17 21:23:27

+0

你能否详细说明一下在编程语言中一个更严格的字符串文字定义使用?那些单引号字符串文字可以跨越多行吗?在字符串文字中是否有用于转义单引号的语法? – 2012-03-18 12:01:39

回答

1

假设字符串字面量不跨越多行,并且有 没有语法为了逃避字符串文字中的单引号,我会使用 以下替换命令。

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

它几乎可行 - 如果您为我的示例运行它,它也会更改'mixedCaseValue'和'MY_OWN_VARAIBLE'。但现在我知道要走向哪个方向。谢谢! – east825 2012-03-18 14:41:35

+0

@ east825:我错过了你不想小写字符串以外的所有内容,而只是全部大写的单词。我提出的命令可以改变来做到这一点;请查看答案的更新。 – 2012-03-18 15:54:08

+0

哇!太棒了!它看起来和我想要的完全一样(至少乍一看)。我认为你是赢家。现在我需要花一些时间在Vim中深入了解它是什么) – east825 2012-03-18 20:20:02

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 
+0

不错的解决方案!我以前不知道'\ @<='和'\ @ ='。以为我认为没有v /开头就会更好。正因为如此,这种模式与字符串文字的相同行上的upperace关键字不匹配(我没有在例子中显示这种情况)。并且至少在第二个大括号内用于匹配行尾的关键字。 – east825 2012-03-17 22:13:25

+1

@ east825:是的。你是对的。这是针对您的示例的特定解决方案,但可能会因其他许多情况而失败。用其他可能性完成你的例子,更多的用户会给出更好的方法。 – Birei 2012-03-17 22:23:10

+0

对不起,我的坏 - 没有'v /'它也会匹配引号内的大写单词(例如'STRING')。 – east825 2012-03-17 22:25:14

1

我内心热爱VIM灵魂卑躬屈膝写这些,但是......

如果这是你不必频繁地做,你可能只是蛮力它通过附加c标记到您的替换命令中以提示确认每次更改;如果你能忍受乏味的话,你应该能够快速地翻阅很多剧本。这种方式(在短期内)可能会比花时间制定一个好的替代命令更快。

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

呃,我觉得很脏。

+0

其实我已经这么做了)我只是想知道可能有人知道一些很好的模式,可以自动进行这种替换。 – east825 2012-03-18 20:14:27

相关问题