2016-11-17 3 views
1

Ich habe eine große .SQL-Datei der Größe ~ 220 MB.Grep/Sed ersetzen kleinen Text in großen .SQL-Datei

nun, dass ich eine TRIGGER-Anweisung in der Datei haben, die einen anderen Benutzer als der MySQL-Datenbank Benutzer verwendet, ich versuche, mit importieren Datenbank, so gibt es unter Fehler bei der Datenbank zu importieren versuchen:

ERROR 1142 (42000) at line 9732: TRIGGER command denied to user 'user_name'@'localhost' for table 'sales_flat_creditmemo' 

Jetzt wie finde ich alle Zeilen mit den TRIGGER-Anweisungen und ändern Sie "user_name" zu mysql Benutzer "benutzername_actual" in der gesamten Datei, ohne es sogar zu öffnen. Das Öffnen dieser Datei in Geany führt ebenfalls zum Absturz des Geany.

+0

Können Sie uns Ihren Versuch zeigen diese selbst zu lösen, oder suchen Sie nur für einen freien Hand-out mit? – ghoti

Antwort

1

Sie können eine Kombination aus grep und sed für den Ersatz in-place verwenden, ohne die Datei tatsächlich zu öffnen.

grep -Iril 'TRIGGER' sql_file | xargs sed -i 's/user_name/username_actual/g' 

Die Zwecke der Flags sind: -

-I -> Binär-Dateien zu ignorieren, während grep auf Dateien zu tun. (Kann hier nicht anwendbar sein) -r -> rekursive Suche unter allen Unterverzeichnisebenen -i -> Ignorieren Fall (Groß- und Kleinschreibung Suche) -l -> Just drucken Sie den Datei-Namen in dem die Übereinstimmung gefunden wird.

Überprüfen Sie mehr in der man grep Seite.

Es gibt auch eine coole alternative Möglichkeit, Vim im Ex Modus zu verwenden, um die Substitution vor Ort durchzuführen.

ex -sc '/TRIGGER/s/user_name/username_actual/|x' file 

Auch eine letzte Lösung sed allein für in-Place-Ersatz

sed -i '/TRIGGER/s/user_name/username_actual/g' 
+0

Danke, das hat mein Problem wirklich gelöst. –

+0

Kannst du die grep params in deiner Antwort erklären, wofür ist "I" da? –

+0

Und wenn das OP weiß, welche Datei die TRIGGER-Anweisungen bereits enthält, warum sollte man sich überhaupt mit dem 'grep' beschäftigen? – ghoti

Verwandte Themen