2016-07-08 4 views
0

Mit einem Terminal auf Mac OSX (iTerm2) ohne externe Apps außer Postgres möchte ich einige Regex Find/Replacements auf einer ziemlich großen (52 MB) pg_dump Datendatei ausführen, während es in eine PostgreSQL-Datenbank importiert wird. Ich muss dies tun, bevor die Dump-Datei PostgreSQL trifft, weil ich die eingehenden SQL-Abfragen transformieren muss, die Tabellen erstellen und ändern.Wie führe ich während eines Imports einen Filter für pg_dump-Daten aus?

Der Shell-Befehl ich die Daten importieren bin mit ist:

psql MyDatabase < mydata.sql 

Gibt es eine Möglichkeit, um Rohr die Daten über einen regulären Ausdruck finden/Filter ersetzen? Kann ich etwas mit nativen Linux-Befehlszeilenprogrammen wie grep tun?

Alternativ, wie würde ich meine Regex Batch und wenden Sie sie auf meine Dump-Datei und speichern Sie dann die Änderungen in eine neue Datei?

+0

Die Frage ist im Moment völlig nutzlos. Sagen Sie 'Regex finden/ersetzen' was? Haben Sie Zeit hier verbracht, wissen Sie nicht, was macht [\ [mcve \]] (http://stackoverflow.com/help/mcve)? – sjsam

+0

@sjsam Ich habe keine Ahnung, was du meinst. – Redtopia

+0

Bearbeiten Sie die Frage, indem Sie Informationen über das zu ersetzende Muster und das neue Muster hinzufügen. Überlegen Sie auch, ob Sie die Tools, die Ihnen zur Verfügung stehen, wie 'sed'' awk' und so hinzufügen. – sjsam

Antwort

2

Sie können sed verwenden, die reguläre Ausdrücke versteht.

Zum Beispiel alle Vorkommen von „myschema“ zu ersetzen, die durch Wortgrenzen mit „anotherschema“ umgeben sind, könnten Sie verwenden:

sed -e 's/\bmy\(schema\)\b/another\1/g' mydata.sql | psql MyDatabase 
+0

Ich werde es versuchen. Was passiert, wenn ich mehrere Regex ausführen muss? Gibt es eine Möglichkeit, sie alle gleichzeitig auszuführen? – Redtopia

+1

Sicher. Stellen Sie einfach mehrere '-e' Optionen bereit. –

+0

Danke für die sed Beratung. Anscheinend, wenn Sie nicht auf Ihren Linux-Befehlen sind, werden Ihre Fragen nicht toleriert. Wenn Sie meinen, dass meine Frage nicht dumm war, können Sie sie vielleicht verbessern. Vielen Dank! – Redtopia

1

Alternativ wie würde ich meine Batch regex ist und wenden sie zu meinem Dump Datei und dann speichern Sie die Änderungen in eine neue Datei?

sed -e 's/\bmy\(schema\)\b/another\1/g' mydata.sql >mysqlnew.sql 

Diese leitet die Ausgabe in eine neue Datei mit dem Namen mysqlnew.sql.

Beachten Sie, dass sed Inplace-Bearbeitungsoption unterstützt. Mit Hilfe der Inplace bearbeiten -i Option, der obige Befehl kann durch

sed i.bak -e 's/\bmy\(schema\)\b/another\1/g' mydata.sql 

ersetzt Dieser Befehl erstellt eine Kopie des ursprünglichen mydata.sql-mydata.sql.bak und macht die Änderungen permanent zu mydata.sql geschrieben.