2017-02-01 2 views
2

Ich habe die Liste der Dateien die erste Zeile zu ersetzen, von der Ausführung dieses BefehlsWie die erste Zeile der einzelnen Dateien mit „find“

find . -type f -name ".txt" 

Ich mag die erste Zeile der Dateien gefunden ersetzen ersetzen mit diesem Text „Linie 1“

meine Recherchen fand ich einen Weg, um die erste Zeile mit

ex -sc '1d|x' file.txt 

dann schreibe eine Datei mit

löschen
echo "line 1"|cat - file.txt > out && mv out file.txt 

aber ich weiß nicht, wie erste Zeile und prepend für alle Dateien

+0

haben Sie versucht, den Befehl exec? –

Antwort

4

Sie exec

find . -name "*.txt" -exec sed -i .ORI '1s/.*/line 1/' {} \; 

die Dateien anstelle Spar Backups als .ORI bearbeiten können.

+0

es hat einen Fehler | sed: -e Ausdruck # 1, Zeichen 1: unbekannter Befehl: '. ' –

+0

Versuchen Sie, das Leerzeichen vor '.ORI' zu entfernen oder nur diesen Parameter zu entfernen (aber dann haben Sie keine Backups). Es gibt viele "sed" Dialekte mit verschiedenen Eigenheiten. Wenn Sie das Skript für verschiedene Plattformen verwenden möchten, wechseln Sie möglicherweise zu Awk oder Perl, die besser standardisiert sind. – tripleee

+0

Ich nehme an, das könnte geändert werden, um mit 'ex' anstelle von' sed' zu arbeiten, aber Sie wissen, es gibt einen Grund, warum wir 'sed' für Batch/Programmed Editing verwenden. – tripleee

0

Sie gefunden löschen exec oder xargs mit find verwenden können, aber für kompliziertere Befehle, die ich immer Verarbeitung in einer Schleife laufen. Es ist klarer so. Hier ist, was Sie tun können:

find . -type f -name '*.txt' | while read -r f; do 
    ex -sc '1d|x' "$f" 
    echo "line 1"|cat - "$f" > out && mv out "$f" 
done 
+0

Sie sollten 'read -r' verwenden, um etwas nerviges Vermächtnisverhalten zu vermeiden, und" $ f "' überall zitieren. – tripleee

+0

".tmp" zu vollständigen Pfadnamen voranzustellen wird sowieso nicht gut funktionieren. – tripleee

+0

Guter Aufruf unter Angabe des Dateinamens. Zurück zum Namen der 'out' Tempdatei. – mroach

Verwandte Themen