2012-03-31 4 views
2

Ich habe ein Sed Skript, um eine Zeile vor einem Schlüsselwort "MYWORD" in der Datei gefunden. Mein Skript ist die folgende:Verwendung von sed auf mehrere Dateien in einem Skript

sed -e '/MYWORD/ i\MY NEW LINE TO BE INSERTED' <inputFilename >outputFilename 

Da dies nur auf einer einzigen Datei auftreten, wie kann ich mein Skript ändern dieser Einsatz auf jede Datei im Verzeichnis auftreten zu lassen?

+0

Sie sagen, dass Ihr Beispielcode tatsächlich * in einer einzigen Datei * funktioniert *? – Graham

Antwort

1

Wie Nosid sagte, können Sie die Option -i verwenden, um eine Datei an Ort und Stelle zu bearbeiten. Lesen Sie die Manpage in Ihrem Betriebssystem, um genau zu bestimmen, wie Sie -i verwenden. Dann können Sie sed wickeln in ein wenig Shell-Skript zu identifizieren und wirken auf die Datei:

for this in foo*.txt; do 
    sed -i'' -e 'your-sed-script' "$this" 
done 

Das heißt, ich bin nicht sicher, dass Ihr Einsatz Methode funktioniert, oder zumindest zuverlässig arbeiten. Ich habe in FreeBSD und OS X getestet, und es hat überhaupt nicht funktioniert. Meine normale Strategie zum Einfügen von Zeilen ist stattdessen awk. So (zum Beispiel):

for this in foo*.txt; do 
    awk '/MYWORD/{print "Extra line of text goes here."} 1' "$this" > "$this.$$" 
    mv "$this.$$" "$this" 
done 

Die awk Linie sucht hier/myWord/(einem erweiterten regulären Ausdruck, während sed standardmäßig grundlegende reguläre Ausdrücke). Wenn es gefunden wird, druckt es zuerst den "Extra" -Text. Dann wird die "1" als "wahr" ausgewertet, die auch die aktuelle Zeile druckt. Der Effekt ist, den Text "Extra" in die Zeile vor MYWORD einzufügen.

Beachten Sie, dass dies kein gutes Skript ist. Es ist verschwenderisch, Rohrleitungen und umbenennen Dateien, die nicht geändert wurden. Sie könnten es verbessern, indem Sie die temporäre Datei "mv" wählen, abhängig von einem Exit-Wert von awk, oder Sie könnten cmp verwenden, um festzustellen, ob die Datei geändert wurde, dann übrig gebliebene temporäre Dateien usw. ... Aber es bringt den Punkt herüber .

Verwandte Themen