SQLite 用弯引号替换直引号

SQLite Replace Straight Quotes with Curly Quotes

我 运行 一个 Ghost 博客,我想找到我所有的单引号和双引号并将其替换为 "curly quotes,"(参见 here),但我不太了解 SQLite .到目前为止,我想出了这个:

update posts set markdown = replace(markdown, '""', '“');

以上命令将我所有的双引号替换为左弯引号 (ALT+0147)。然后我尝试 运行ning 相同的命令,但替换为结束引号 (ALT+0148),如下所示:

update posts set markdown = replace(markdown, '“', '”');

这基本上用结束引号替换了所有开始的大引号。这就是我被困的地方。我不确定如何在 sqlite 中创建异常,以便它只替换后面有文本的引号。此外,我还没有考虑过我希望我的直引号保持不变的情况,例如在 HTML 链接中,正如评论中指出的那样。

更新:有效

多亏了一个答案,我找到了一个解决方案,在我的案例中效果很好!请注意,我使用 SQLite 数据库浏览器 来更改我的数据库 -

update posts set markdown = replace(markdown, ' "', ' “');
update posts set markdown = replace(markdown, '." ', '.” ');
update posts set markdown = replace(markdown, '" ', '” ');

以上两个命令已经将所有的左双引号替换为弯引号,右引号也一样。正如下面的答案所述,现在剩下要做的就是涵盖所有可能出现此类引用的可能性。单引号也是如此:

update posts set markdown = replace(markdown, ' ''', ' ‘');
update posts set markdown = replace(markdown, '.'' ', '.’ ');
update posts set markdown = replace(markdown, ''' ', '’ ');

中间的所有撇号:

update posts set markdown = replace(markdown, '''', '’');

SQLite(我知道的基本版本)在文本操作方面不是很强大。即使使用 sed、awk 或 perl 之类的东西,要让一个单一的替代品做 OP 想要的也可能不容易。

我将提供一些纯 SQLite 方法,需要对其进行扩展和组合以涵盖所有需要的情况(而不是不需要的情况)。 诚然,查找并涵盖所有案例有点乏味。但这是我在 SQLite 中能想到的最好的。我很乐意赞成任何更简单、更强大的答案。 您需要将您喜欢的食谱应用到您的数据库中。
将它们扩展到涵盖我没有想到的情况也应该很容易。

我建议首先只使用简单的方法来尝试每个方法的效果,那样只会以更改的形式显示 "markdown" 列。只有当你喜欢它对你所有条目的影响时,你才应该应用它,使用 "update/set" 东西。 (我指望你能做到这一点,你对自己尝试的引用看起来不错。)

只是解释一下;应用方法 1 和 2 将涵盖我在您的示例输入中发现的一个示例,即 "What. A. FILM."。 在聊天中,您(非常感谢,谢谢)指出其他食谱是 "reading your mind"。发现模式并将其扩展到任何其他示例应该不难。
我没有在 SQLite 中看到解决方案的一件事是 'I repeat " WHAT A FILM " blabla.' 问题是引号和引用文本之间的空格。在 sed/perl/awk 中,解决方案可以检查 "first/odd straight quote" 和 "second/even straight quote",但 SQLite 不能轻易做到这一点,也许根本不能,欢迎提出想法。

1 将 "space followed by straight double quote" 替换为 "space followed by opening curly":
select replace(markdown, ' "', ' “') from posts;

2 将 "straight double quote followed by space" 替换为 "closing curly followed by space":
select replace(markdown, '" ', '” ') from posts;

3 将 "straight double quote followed by comma" 替换为 "closing curly followed by comma":
select replace(markdown, '",', '”,') from posts;

4 将 "straight double quote followed by semicolon" 替换为 "closing curly followed by semicolon":
select replace(markdown, '";', '”;') from posts;

5 将 "straight double quote followed by fullstop" 替换为 "closing curly followed by fullstop":
select replace(markdown, '".', '”.') from posts;

对打开和关闭单引号执行相同的操作。 当您开始发明自己的替代品时,请确保不要覆盖 http link 并且不要覆盖 '',这两者显然都不是您预期的替代目标。

注意,我明确承认这些替换在我自己的机器上失败。但在一次聊天中,OP 尝试了最简单的版本,并确认他们 成功 。主要区别似乎是他使用数据库浏览器。
我考虑这些东西 "tested successfully",只是不在我的机器上。