替换每个不带引号的事件

时间:2015-05-12 00:37:00

标签: ruby regex vim

我试图在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解决方案是理想的,但一般解决方案也会有所帮助。

仅供参考:这是一个rake任务,它将远程PG数据库拉入本地SQLite3数据库。

1 个答案:

答案 0 :(得分:0)

使用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);