2009-05-14 7 views
1

Ich bin frustriert genug, dass ich dachte, es war Zeit, eine Frage zu stellen.Mit grep und xargs, vermeiden 'unterminated quote' Fehler

Ich versuche, eine E-Mail-Adresse über eine Website zu ersetzen, die in 1000 von Seiten fest codiert ist. Es ist auf einem FreeBSD 6.3 Server. Hier

ist der Befehl, die ich benutze:

grep -R --files-mit-matches 'E-Mail \ @ domain.com'. | sortieren | uniq | xargs perl -pi -e 's/Email \ @ domain.com/Email \ @ newdomain.com /' * .html

Und hier ist der Fehler, die ich erhalte:

xargs: ungekündigten Zitat

Seltsamerweise, wenn ich diesen Befehl auf einen Testfall von 3 Dateien ausführen (in einer verschachtelten Struktur) funktioniert es gut. Ich habe gegoogelt und die meisten Lösungen scheinen sich damit zu beschäftigen, nach dem ein .print0 hinzuzufügen. und ein -0 nach den Xargs. Dies führt jedoch zu einer anderen Reihe von Fehlern, die dazu führen, dass ich glaube, dass ich die Dinge an den falschen Stellen veröffentliche.

Vielen Dank im Voraus für Ihre Hilfe

Antwort

1

Warum Sie eine Liste von HTML-Dateien in xargs geben? Dieses Programm nimmt seine Dateiliste aus der Pipeline (Ausgabe von grep).

2

Pax ist korrekt. Ich würde weiter korrigieren, um so etwas wie:

grep -R --files-with-matches 'Email\@domain.com' . -print0 | xargs -0 perl -pi -e 's/Email\@domain.com/Email\@newdomain.com/' 

EDIT:

Dank kcwu, das ist die volle FreeBSD:

grep -R --files-with-matches 'Email\@domain.com' . --null | xargs -0 perl -pi -e 's/Email\@domain.com/Email\@newdomain.com/' 

Bitte beachte, dass ich sort und uniq entfernt haben. --files-without-match ist so dokumentiert, dass "bei der ersten Übereinstimmung gestoppt wird", sodass Sie keine doppelten Dateien erhalten. -print0 und -0 gewährleisten (und behandeln) eine Null-terminierte Dateiliste, was von entscheidender Bedeutung ist, da POSIX erlaubt, dass Dateinamen neue Zeilen enthalten.

Beachten Sie, dass ich nicht weiß, Perl, aber ich gehe davon aus etwa der, dass ein Teil äquivalent zu:

sed -i s/Email\@domain.com/Email\@newdomain.com/g 
+0

Danke für die schnelle Antwort. Wenn ich versuche, das -print0 hinzuzufügen, bekomme ich Folgendes: jhmail # grep -R - Dateien mit Übereinstimmungen 'FineArt \ @ westliveson.com'. -print0 | xargs -0 perl -pi -e's/FineArt \ @ westliveson.com/FA \ @ westliveson.com/' grep: ungültige Option - p Verwendung: grep [OPTION] ... PATTERN [DATEI] .. Versuchen Sie 'grep --help 'für weitere Informationen. –

+1

Unter FreeBSD verwenden Sie "--null" anstelle von "-print0" – kcwu

+0

Perfekt! Vielen Dank für Ihre Hilfe. Sehr geschätzt. –

0

Verwenden GNU Parallel:

grep -R --files-with-matches 'Email\@domain.com' . | sort | uniq | parallel -q perl -pi -e 's/Email\@domain.com/Email\@newdomain.com/g' 

Sehen Sie das Intro-Video mehr zu erfahren: http://www.youtube.com/watch?v=OpaiGYxkSuQ