2017-12-09 9 views
4

Ich möchte die erste Zeile aller Dateien in einem Ordner entfernen, wenn die Datei mit Uuid beginnt und so habe ich eine Arbeits sed Befehl, die wie folgt aus:Sed erste Zeile von Dateien löschen

$ sed -i '' '/^uuid/d' *

das funktioniert gut und entfernt alle Zeilen beginnend mit Uuid.

Jetzt mag ich das Drehbuch verbessern, indem nur die erste Zeile entfernen, wenn es mit Uuid, da einige der Dateien beginnt, hat mehr uuid: s und nur die eine auf der ersten Zeile gelöscht werden soll. So, jetzt verbessert ich den Befehl wie folgt aussehen:

$ sed -i '' '1{/^uuid/d;}' *

nun auch dieser Befehl funktioniert, aber nur auf der ersten Datei im Ordner und auch wenn ich ein einfaches laufen (nur entfernen erste Zeile) Version wie:

$ sed -i '' '1d' *

es wirkt sich nach wie vor nur die erste Datei.

Warum ist das?

Ich bin auf dem Mac (so die BSD-Version von Sed als ich zu verstehen gekommen bin) und ich habe auch versucht, die Gnu-Sed-Version über Brew, $ brew install gnu-sed --with-default-names, ohne Glück zu installieren.

ich sed - 25 examples to delete a line or pattern in a file gelesen habe, sed - 20 examples to remove/delete characters from a file und gegoogelt sed delete first line in files

UPDATE 1: Wie in den Kommentaren Vorschlag john1024 Ich habe mit der -s Option getestet, aber nicht sicher, wie es zu benutzen.

$ sed -s '1d' ./* sed: illegal option -- s

Wenn ich man sed überprüfen kann ich die -s & --seperate Option finden, so ich hier falsch etwas tun muss.

UPDATE 2: Ok, Fortschritt ... find . -iname '*.yml' -exec sed -i '' -e '1{/uuid/d;}' {} \; funktioniert der Trick, aber ich Fehlermeldung sed: can't read : No such file or directory

Vielen Dank für jede Hilfe oder Anleitung zu sagen!

: ola

+4

Um dieses Problem auf GNU sed (Linux) zu lösen, benutzt man die '-s' Option zu sagen, sed die„Dateien als getrennt betrachtet eher als als ein einziger, kontinuierlicher langer Strom. " Jemand, der mit BSD sed vertraut ist, muss Ihnen sagen, ob es eine ähnliche Option auf Macs gibt. – John1024

+3

Es scheint, dass es ein allgemeines Geheimnis ist, dass bsd sed nicht den Schalter -s unterstützt, also schlagen andere Leute vor, entweder eine Art Schleife zu benutzen, um alle Dateien zu verarbeiten (zB 'find ...... | sed' oder 'find .. . -exec sed'). Sie könnten auch 'foldername/*' oder './*' versuchen und Sie können Glück haben. ... https://forums.freebsd.org/threads/50187/ und auch hier https://stackoverflow.com/questions/19590980/multiple-replacements-with-one-sed-command –

+0

Ok, also ich habe versuchte beide 'finden./-iname '* .yml' | sed -e '1 {/^uuid/d;}' und 'ls * .yml | sed -e '1 {/^uuid/d;}' 'Beide, die nur eine Liste der Dateien im Verzeichnis unverändert ergibt. – ola

Antwort

2

sed -i '' '1{/^uuid/d;}' * wird nur ändern, um die erste Datei, weil die Zeilennummern kumulativ über Dateien gezählt, so „Linie 1“ tritt nur einmal, es ist die erste Zeile der ersten Datei ist. Um etwas mit der ersten Zeile von mehreren Dateien zu tun, müssen Sie sed einmal pro Datei ausführen.

Sie können tun, dass eine einfache for Schleife:

for f in *; do sed -i '' '1{/^uuid/d;}' "$f"; done