2017-06-01 36 views
1

我運行Ghost博客,我想查找並將所有單引號和雙引號替換爲「引號」(請參見here),但我並不熟悉SQLite。到目前爲止,我想出了這一點:SQLite用曲線引號替換直引號

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

上面的命令代替我所有的雙引號來打開彎引號(ALT + 0147)。然後我試圖運行相同的命令,但用收盤報價(ALT + 0148),像這樣:

update posts set markdown = replace(markdown, '「', '」'); 

這基本上替換所有與收盤報價在打開彎引號。這就是我被卡住的地方。我不知道如何在sqlite中創建一個異常,以便它只替換後面帶有文本的引號。此外,我還沒有考慮過這種情況,我希望我的直引號保持不變,比如在HTML鏈接中,正如評論中指出的那樣。

更新:它工作

多虧了一個答案,我已經找到了解決方案,它在我的情況得很完美!需注意,我用的是DB瀏覽器的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, '''', '’'); 
+0

請提供一個[mcve],即一個合適的玩具數據庫的'.dump'。 – Yunnosch

+0

確保您具有涵蓋您想要處理的所有案例的樣本輸入。例如。字符串以引號開頭和結尾,字符串在中間包含引號。字符串以引用詞開頭,然後繼續。開始不加引號,然後以引用結束。以上兩個引用部分的組合。引用的部分包含空格.... – Yunnosch

+0

嗨@Yunnosch我已經導出並從博客上傳一篇文章作爲.SQL到https://pastebin.com/E1f9waZh 順便說一下,我使用「DB Browser for SQLite 「程序來改變我的數據庫。我從那裏輸出它。 – Nick

回答

1

SQLite的(在基本版本,我知道)是不是在文本處理功能非常強大。即使像sed,awk或perl這樣的東西,要做一個OP所需要的替換也許並不容易。

我將提供一些純粹的SQLite配方,這些配方需要進行擴展和組合以涵蓋所有需要的情況(而不是不期望的情況)。無疑,找到並涵蓋所有案例有點乏味。但這是我能在SQLite中想到的最好的。我很高興得到更簡單,更有效的答案。 你需要將你喜歡的食譜應用到你的數據庫。
它也應該很容易延伸到涵蓋我沒有想到的情況。

我建議首先嚐試只使用裸配方的每個效果,這將只顯示更改表單中的「降價」列。只有當你喜歡它對所有條目的影響時,你才應該使用「更新/設置」的東西。 (我依靠你能夠做到這一點,你的報價你自己的嘗試看起來不錯。)

只是爲了解釋;應用配方1和2將覆蓋您在示例輸入中發現的一個示例,即「What。A. FILM。」。 在聊天中,你有(相當討人喜歡,謝謝)表示其他食譜「正在讀你的心靈」。發現模式並將其擴展到任何其他示例應該不難。
我在SQLite中看不到解決方案的一件事就是'我重複'什麼是電影「blabla」。問題是引號與引用文本之間的空格。在sed/perl/awk解決方案中,可以檢查「第一/奇數直接引用」和「第二個/甚至是直接引用」,但SQLite無法輕鬆做到這一點,也許根本不會,想法是受歡迎的。

1替換「空間,接着直雙引號」,由「空間,隨後通過打開卷曲」:
select replace(markdown, ' "', ' 「') from posts;

2替換「直雙引號,隨後空間」,由「右大後跟空間」:
select replace(markdown, '" ', '」 ') from posts;

3通過 「右大後跟逗號」 替換 「直雙引號後面的逗號」:
select replace(markdown, '",', '」,') from posts;

4由「右大隨後分號」替換「直雙引號隨後分號」:
select replace(markdown, '";', '」;') from posts;

5替換「直雙引號隨後句號」由「右大後跟句號」:
select replace(markdown, '".', '」.') from posts;

爲打開和關閉單引號做同樣的事情。 當你開始發明自己的替代品時,請確保不要覆蓋http鏈接,並且不要涵蓋'',這兩者顯然不是你想要的替換目標。

請注意,我明確承認這些替換品在我自己的機器上有失敗。但在一次聊天中,OP已經嘗試了最簡單的版本,並確認對他而言,他們成功。主要區別似乎是他使用數據庫瀏覽器。
我認爲這些東西「測試成功」,只是不在我的機器上。