2017-06-01 1 views
1

Ich führe einen Ghost Blog und ich möchte alle meine einfachen und doppelten Anführungszeichen in "curly quotes" finden und ersetzen (siehe here), aber ich kenne SQLite nicht sehr gut. Bisher habe ich mit diesem kommen:SQLite Ersetzen Sie gerade Zitate mit Curly Quotes

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

Der obige Befehl an alle meine doppelte Anführungszeichen ersetzt typografische Anführungszeichen zu öffnen (ALT + 0147). Dann habe ich versucht, den gleichen Befehl ausgeführt wird, jedoch unter Ersatz für den Schlusskurs (ALT + 0148), etwa so:

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

, die im Grunde alle geschweifte Anführungszeichen mit Schließung Anführungszeichen ersetzt. Und da stecke ich fest. Ich bin nicht sicher, wie man in sqlite eine Ausnahme macht, so dass es nur die Anführungszeichen ersetzt, die Text nach ihnen haben. Außerdem habe ich keine Fälle berücksichtigt, in denen meine direkten Zitate unverändert bleiben sollen, wie in den HTML-Links, wie in den Kommentaren erwähnt.

Update: It Works

Dank einer Antwort, ich habe eine Lösung, die in meinem Fall gefunden perfekt gearbeitet hat! Beachten Sie, dass ich den DB Browser für SQLite verwendet, um meine Datenbank Änderungen an -

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

Die beiden oben genannten Befehle ersetzt haben alle Öffnen doppelte Anführungszeichen mit typografische Anführungszeichen und das gleiche gilt für die Schließung Anführungszeichen. Alles, was jetzt noch zu tun ist, ist, wie in der Antwort unten angegeben, alle Möglichkeiten zu umfassen, wo solche Zitate erscheinen können. Das Gleiche gilt für die einfachen Anführungszeichen, wie so:

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

Und für all dazwischen Apostrophe:

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

Bitte geben Sie eine [mcve], d. H. Eine ".dump" einer angemessen zugeschnittenen Spielzeug-Datenbank. – Yunnosch

+0

Stellen Sie sicher, dass Sie eine Beispieleingabe haben, die alle Fälle abdeckt, die Sie behandeln möchten. Z.B. string beginnt und endet mit Anführungszeichen, string enthält ein zitiertes Wort in der Mitte. String beginnt mit einem zitierten Wort und wird dann fortgesetzt. Beginnt ohne Anführungszeichen und endet mit Anführungszeichen. Kombinationen von oben mit zwei zitierten Teilen. Zitate Teile mit Leerzeichen .... – Yunnosch

+0

Hallo @Yunnosch Ich habe einen Beitrag aus dem Blog als .SQL exportiert und hochgeladen https://pastebin.com/E1f9waZh Übrigens verwende ich den "DB Browser for SQLite "Programm, um Änderungen an meinen Datenbanken vorzunehmen. Ich habe es von dort exportiert. – Nick

Antwort

1

SQLite (in der Basisversion ich weiß) in Textmanipulation nicht sehr mächtig ist. Und selbst mit Dingen wie sed, awk oder perl wäre es wahrscheinlich nicht einfach, einen einzigen Ersatz zu bekommen, was OP will.

Ich werde einige reine SQLite Rezepte zur Verfügung stellen, die erweitert und kombiniert werden müssen, um alle gewünschten Fälle abzudecken (und nicht die unerwünschten Fälle). Das Auffinden und Abdecken aller Fälle ist zugegebenermaßen etwas mühsam. Aber das ist das Beste, was ich mir in SQLite vorstellen kann. Ich freue mich, eine einfachere, stärkere Antwort zu erhalten. Sie müssen die Rezepte, die Sie mögen, auf Ihre Datenbank anwenden.
Es sollte auch einfach sein, sie auf Fälle auszudehnen, an die ich nicht gedacht habe.

Ich empfehle, zuerst die Wirkung von jedem von ihnen zu versuchen, indem Sie nur das bloße Rezept verwenden, das nur die Spalte "Abschlag" in geänderter Form zeigt. Nur wenn Sie seine Wirkung auf alle Ihre Einträge mögen, sollten Sie sie anwenden, indem Sie die "update/set" -Ding verwenden. (Ich verlasse mich darauf, dass Sie das können, Ihr Zitat von Ihrem eigenen Versuch sieht gut aus.)

Nur um zu erklären; Die Anwendung von Rezept 1 und 2 behandelt das Beispiel, das ich in Ihrer Beispieleingabe entdeckt habe, das "Was. A. FILM.". Im Chat hast du (eher schmeichelhaft, danke) angedeutet, dass die anderen Rezepte "deine Gedanken lesen" sind. Das Muster zu erkennen und es auf irgendein anderes Beispiel auszudehnen, sollte nicht schwierig sein.
Die einzige Sache, für die ich keine Lösung in SQLite sehe, wäre "Ich wiederhole" WAS FÜR EIN FILM "blabla." Das Problem sind die Leerzeichen zwischen den Anführungszeichen und dem zitierten Text.In sed/perl/awk-Lösungen könnte nach "ersten/ungeraden geraden Anführungszeichen" und "zweiten/geraden Anführungszeichen" suchen, aber SQLite kann das nicht leicht, vielleicht gar nicht, Ideen sind willkommen.

1 Ersetzen "space durch gerade Anführungszeichen gefolgt" von "space gefolgt von geschweiften Öffnen":
select replace(markdown, ' "', ' “') from posts;

2 Replace "straight doppeltes Anführungszeichen durch Leerzeichen" durch "geschweiften durch Leerzeichen":
select replace(markdown, '" ', '” ') from posts;

3 Ersetzen Sie "gerade Anführungszeichen durch Komma" durch "durch Komma geschweiften gefolgt Schließen":
select replace(markdown, '",', '”,') from posts;

4 Ersetzen Sie „gerade Anführungszeichen durch Semikolon“ von „lockig durch Semikolon Schließen“:
select replace(markdown, '";', '”;') from posts;

5 Ersetzen Sie „gerade doppelte Anführungszeichen, gefolgt von fullstop“ durch „geschweiften gefolgt von fullstop“:
select replace(markdown, '".', '”.') from posts;

Machen Sie dasselbe für das Öffnen und Schließen von einfachen Anführungszeichen. Wenn Sie beginnen, Ihre eigenen Ersatz zu erfinden, stellen Sie sicher, dass Sie NICHT den http-Link abdecken und NICHT die '' abdecken, die offensichtlich nicht Ihr beabsichtigtes Ersatzziel zu sein scheinen.

Hinweis, ich gebe ausdrücklich zu, dass diese Ersetzungen haben gescheitert auf meiner eigenen Maschine. Aber in einem Chat hat OP die einfachste Version ausprobiert und bestätigt, dass sie ihm gelingen. Der Hauptunterschied scheint zu sein, dass er einen Datenbankbrowser verwendet.
Ich halte diese Dinge dafür "erfolgreich getestet", nur nicht auf meiner Maschine.