[英]replace every occurrence that is unquoted
我試圖在Vim中編寫一個正則表達式,以在SQL文件中將每次出現的true
替換為't'
,將false
替換為'f'
。 復雜的是,當引號內的任意位置出現true
或false
時,我不應該替換它們。
我正在使用幾乎可以正常工作的以下正則表達式:
%s/\v^(([^'"]*)|(.*('.*'|".*").*)*)\zs((t)rue|(f)alse)/'\6\7'/
# no qts or even number of qts \6 \7
但是有一個小問題:每次運行僅替換一組true
和false
。 例如(匹配項以粗體突出顯示):
INSERT INTO pages VALUES (42, NULL, 'string', true, '', NULL, true, false , 1); INSERT INTO pages VALUES (42, NULL, 'string', true, NULL, true, false , 1); INSERT INTO pages VALUES (42, NULL, true , '', NULL, true, false, 1); INSERT INTO pages VALUES (42, NULL, true, NULL, true, false , 1);
我已經嘗試過各種方法,並且已經在互聯網上搜索但找不到任何東西,所以我陷入了困境。 這里有任何正則表達式向導誰知道我該如何解決?
Vim或Ruby解決方案將是理想的選擇,但一般的解決方案也將有所幫助。
僅供參考:這是一個瑞克任務,它將遠程PG數據庫拉入本地SQLite3數據庫。
使用Vim substitute
以及否定的后瞻性和否定的前瞻性,以及從當前嘗試中獲得的一些啟發:
%s/\([\S"']\)\@<!\(\(t\)rue\|\(\(f\)alse\)\)\([\S"']\)\@!/'\3\5'/g
下列
INSERT INTO pages VALUES (42, NULL, 'string true', true, '', NULL, true, false, 1);
INSERT INTO pages VALUES (42, NULL, "string false", true, NULL, true, false, 1);
INSERT INTO pages VALUES (42, NULL, true, '', NULL, true, false, 1);
INSERT INTO pages VALUES (42, NULL, true, NULL, true, false, 1);
變成:
INSERT INTO pages VALUES (42, NULL, 'string true', 't', '', NULL, 't', 'f', 1);
INSERT INTO pages VALUES (42, NULL, "string false", 't', NULL, 't', 'f', 1);
INSERT INTO pages VALUES (42, NULL, 't', '', NULL, 't', 'f', 1);
INSERT INTO pages VALUES (42, NULL, 't', NULL, 't', 'f', 1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.