簡體   English   中英

替換所有未引用的事件

[英]replace every occurrence that is unquoted

我試圖在Vim中編寫一個正則表達式,以在SQL文件中將每次出現的true替換為't' ,將false替換為'f' 復雜的是,當引號內的任意位置出現truefalse時,我不應該替換它們。

我正在使用幾乎可以正常工作的以下正則表達式:

%s/\v^(([^'"]*)|(.*('.*'|".*").*)*)\zs((t)rue|(f)alse)/'\6\7'/
#       no qts or even number of qts   \6     \7

但是有一個小問題:每次運行僅替換一組truefalse 例如(匹配項以粗體突出顯示):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM