2009-08-07 7 views
8

Ich habe eine riesige SQL-Datei, die auf dem Server ausgeführt wird. Der Speicherabzug stammt von meinem Computer und es gibt einige Einstellungen, die sich auf meinen Rechner beziehen. Also grundsätzlich möchte ich jedes Auftreten von "c://temp" durch "//home//some//blah" ersetzenLinux-Befehl, um Zeichenfolge in LARGE-Datei durch eine andere Zeichenfolge zu ersetzen

Wie kann dies von der Befehlszeile aus erfolgen?

+0

Sie sind ein nachlauf% in Ihrem Befehl fehlt. Es ist s% foo% bar% nicht s% foo% bar –

Antwort

29

sed ist eine gute Wahl für große Dateien.

Es ist eine gute Wahl, weil nicht die ganze Datei gleichzeitig liest, um es zu ändern. Unter Angabe der Bedienungsanleitung:

Ein Strom-Editor verwendet wird Grundtext Transformationen auf einem Eingangsstrom (eine Datei oder eine Eingabe von einem Pipeline) durchzuführen. Während in ähnlicher Weise ähnlich zu einem Editor, der scripted Bearbeitungen erlaubt (wie ed), arbeitet sed von machen nur einen Durchlauf über die Eingabe (s), und ist folglich mehr effizient. Aber es ist sed Fähigkeit, Filter Text in einer Pipeline, die insbesondere unterscheidet es von anderen Arten von Editoren.

Der relevante manuelle Abschnitt ist here. Eine kleine Erklärung folgt

-i.bak in Place-Bearbeitung ermöglicht

s% foo% bar% Verwendungen s eine Sicherungskopie mit BAK-Erweiterung zu verlassen, der Ersatz-Befehl, der Ersatz Spiele von ersten Zeichenfolge zwischen dem% -Zeichen, 'foo', für den zweiten String, 'bar'. Es wird normalerweise als s // geschrieben, aber weil Ihre Zeichenfolgen viel von Schrägstrichen haben, ist es bequemer, sie für etwas anderes zu ändern, damit Sie vermeiden, ihnen zu entkommen.

Beispiel

 
[email protected]:~$ sed -i.bak -e 's%C://temp%//home//some//blah%' a.txt 
[email protected]:~$ more a.txt 
//home//some//blah 
D://temp 
//home//some//blah 
D://temp 
[email protected]:~$ more a.txt.bak 
C://temp 
D://temp 
C://temp 
D://temp 
+2

Sie können ein anderes Zeichen verwenden, um die Schrägstriche nicht zu zitieren, z. B. sed -e "s% C: // temp%/home // einige // blah% ". Mit der Option -i können Sie die Datei auch speichern, wenn Sie sich der Optionen sicher sind. – dalloliogm

+0

Dies ist der Befehl, den ich tippe: sed -i.bak -e% C: \\ temp \%/home/liveon/public_html/tmp 'liveon.sql und das ist der Fehler, den ich bin bekommen: sed: -e Ausdruck # 1, Char 41: nicht abgeschlossen 's 'Befehl Jeder? – coderama

+0

Sie fehlen die endgültige%, der Befehl ist s% foo% bar% –

1

Der sed Befehl kann das tun. Anstatt die Schrägstriche zu entkommen, können Sie ein anderes Trennzeichen (_ in diesem Fall) wählen:

sed -e 's_c://temp/_/home//some//blah/_' file1.txt > file2.txt 
+0

Sie verpasst den letzten Unterstrich: "s_c: // temp/_/home // einige // blah_" – dalloliogm

+0

danke! Es ist jetzt behoben. – stefanw

4

sed Versuchen? Etwas wie:

sed 's/c:\/\/temp/\/\/home\/\/some\/\/blah/' mydump.sql > fixeddump.sql 

Escaping all jene Schrägstriche macht dies allerdings schrecklich aussehen, ist hier ein einfacheres Beispiel die foo bar ändert.

sed 's/foo/bar/' mydump.sql > fixeddump.sql 

Wie andere erwähnt haben, können Sie Ihr eigenes Trennzeichen fest, welche die leaning toothpick syndrome in diesem Fall verhindern würde:

sed 's|c://temp\\|home//some//blah|' mydump.sql > fixeddump.sql 

Die clevere Sache über sed ist, dass es auf einem Strom Betrieb eher als eine Datei auf einmal, so dass Sie große Dateien mit nur wenig Speicher verarbeiten können.

+0

Danke Paul! Intellij Idea wird verrückt und macht das für einige Minuten, während es bei sed nur 1 Sekunde dauert, um den umgekehrten Schrägstrich durch einen doppelten Backslash in meiner SQL-Datei zu ersetzen. – gumkins

12

Nur der Vollständigkeit halber. Ersetzen durch perl.

perl -i -p -e 's{c://temp}{//home//some//blah}g' mysql.dmp 

Es sind auch keine Backslash-Escapes erforderlich. ;)

+10

Bitte beachten Sie, dass Sie, wenn Sie das Flag "-i" ohne Erweiterung verwenden, kein Backup * erhalten. Wenn Sie eine Sicherungskopie wünschen, versuchen Sie '-i.bak', die die In-Place-Bearbeitung * durchführt und Ihnen ein Backup des Originals als' original.bak' zur Verfügung stellt, so ziemlich kostenlos. – Telemachus

+0

Ich lasse mein Versionskontrollsystem die Backups machen. – jrockway

+3

@Jrockway: das ist schön für dich Ich bin mir sicher, aber es geht davon aus, dass die fraglichen Dateien unter Versionskontrolle stehen und dass Sie wissen, was -i.bak tut und sich entschieden hat, es nicht zu benutzen. Ich wünschte nur, dass Leute, die den Schalter -i empfehlen, zwei Sekunden brauchen, um den Unterschied zwischen -i und -i.bak zu erklären. Es wird wirklich weh tun, wenn die Dateien, mit denen Sie spielen, nicht unter Versionskontrolle stehen und Sie einen einfachen Tippfehler machen (z. B. vergessen Sie das Flag -p). – Telemachus

3

Es gibt auch ein Nicht-Standard-UNIX-Dienstprogramm, rpl, das genau dasselbe tut, was die sed Beispiele tun; Ich bin mir jedoch nicht sicher, ob rpl streamwise funktioniert, also ist die sed die bessere Option hier.

+0

Heh, sind Sie zufällig ein Freund des Entwicklers von rpl?:-) –

+0

Nee, noch nie von dem Typen außerhalb des Utils gehört; Es war praktisch, wenn ich einen Stapel-Ersetzungs-Job für ein paar tausend Textdateien einmal machen wollte, und ich habe es in meiner Toolbox aufbewahrt. –

+0

Es wäre wert zu sagen, * warum * Sie empfehlen es in diesem Fall (oder warum Sie vielleicht, da Sie die Empfehlung zur Hälfte zurücknehmen). Das heißt, anstatt einfach den Namen eines Dienstprogramms zu kassieren, sagen Sie uns bitte, was Ihnen daran gefallen hat. – Telemachus

1
perl -pi -e 's#c://temp#//home//some//blah#g' yourfilename 

Die -p wird dieses Skript als eine Schleife behandeln, wird die angegebene Datei Zeile für Zeile lesen Sie die regex Suche läuft und ersetzen.

-i Dieses Flag sollte in Verbindung mit dem Flag -p verwendet werden. Dies befiehlt Perl, die Datei an Ort und Stelle zu bearbeiten.

-e bedeutet nur ausführen diesen Perl-Code.

Viel Glück

+0

danke für die Erklärung –

1

gaffen

awk '{gsub("c://temp","//home//some//blah")}1' file