Bash-Skript eine Reihe von Dateien zu bearbeiten
-
06-07-2019 - |
Frage
eine Reihe von Daten zu verarbeiten und bekommen sie bereit, in unsere Datenbank eingefügt werden, erzeugen wir eine Reihe von Shell-Skripten. Jeder von ihnen hat etwa 15 Zeilen, eine für jede Tabelle, die die Daten gehen. Ein ein aktueller Importstapel einige der Importdateien fehlgeschlagen in eine bestimmten Tabelle gehen. Also habe ich eine Reihe von Shell-Skripten (etwa 600), wo ich die ersten 7 Zeilen kommentieren, dann die Datei erneut aus. Es gibt etwa 6000 Shell-Skripten in diesem Ordner, und nichts über eine bestimmte Datei kann mir sagen, ob es die Bearbeitung benötigt. Ich habe eine Liste von denen Dateien, die ich aus der Datenbank Ausgang gezogen.
So wie ich einen Bash-Skript schreiben (oder irgendetwas anderes, das besser funktionieren wurde), um diese Liste von Dateinamen zu übernehmen und für jeden von ihnen, kommentiert die ersten 7 Zeilen aus, und führen Sie das Skript?
EDIT:
#!/usr/bin/env sh
cmd1
cmd2
cmd3
cmd4
cmd5
cmd6
cmd7
cmd8
Nicht sicher, wie lesbar das ist. Grundsätzlich sind die ersten 7 Zeilen (die erste Zeile nicht mitgezählt), müssen sie a # zu Beginn hinzugefügt werden. Hinweis: Die Dateien wurden redaktionell bearbeitet von VIM jede Zeile kürzer zu machen und teilweise abgeschnitten zu kopieren. Aber im Hauptteil jeder Datei gibt es eine Zeile mit Echo beginnen, dann einer Zeile mit sqlldr Start
Lösung
Mit sed können Sie eine Zeilennummer Bereich in der Datei angeben, die geändert werden.
#!/bin/bash
while read line
do
# add a comment to beginning of lines 1 - 7 and rename the script
sed '3,9 s/^/#/' $line > $line.new
exec $line.new
done < "filelist.txt"
Sie können dies testen wollen, bevor es auf alle diese Skripte ausgeführt ...
EDIT:. Geändert Zahlen der Linien Kommentare zu reflektieren
Andere Tipps
Grob gesagt:
#!/bin/sh
for file in "$@"
do
out=/tmp/$file.$$
sed '2,8s/^/#/' < $file > $out
$SHELL $out
rm -f $out
done
Angenommen, Sie kümmern sich nicht für Rennbedingungen über die Überprüfung etc.
ex scheint gemacht für das, was Sie tun möchten.
Zum Beispiel für die Bearbeitung einer Datei mit einem hier Dokument:
#!/bin/sh
ex test.txt << END
1,12s/^/#/
wq
END
Das wird die ersten 12 Zeilen in „test.txt“ Kommentar aus. Für Ihr Beispiel könnten Sie "$FILE"
oder ähnliches versuchen (einschließlich Anführungszeichen!).
Dann sie die übliche Art und Weise ausgeführt werden, das heißt ./"$FILE"
edit: $SHELL "$FILE"
ist wahrscheinlich ein besserer Ansatz sie (von einem der oben commenters) zu laufen
Am Ende wirst du den Linux-Befehl sed verwenden wollen. Was auch immer Logik, die Sie im Skript platzieren müssen, wissen Sie. Aber Ihr Skript wird letztlich sed nennen. http://lowfatlinux.com/linux-sed.html