2012-03-17 39 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

相關問題