Linux Bash Script:
Ich möchte gerne ein Script programmieren, das in bestimmten bestehenden Dateien ein paar Zeilen an einer bestimmten Stelle einfügt.
Und zwar werde ich das immer dann brauchen, wenn ich Linux neu installiere. In der alten Linux Version habe ich zum Beispiel mal irgendeine Config Datei auf "/" editiert. Nach der Installation der neuen Linux-Version möchte ich dass alle Dateien, die ich in der alten Version einmal editiert habe nun auch in der neuen Version wieder die gleichen zusätzlichen Einträge bekommen.
Ich stelle mir das so vor, dass ich eine Script-Datei führe, wo ich immer wenn ich eine Änderung an einer config Datei auf "/" vorgenommen habe, die Änderung protokolliere.
Wenn ich dann die neue Linux Version installiere, dann kann ich einfach nur dieses Script mit sudo starten und alle Änderungen, die ich in diesem Script protokolliert habe, werden im neu installierten System wieder hergestellt.
Ich weiss, dass man das mit dem Befehl ...
1 | sed -i '/Suchmuster/a NeueZeile1\nNeueZeile2\nNeueZeile3' dateiname |
... machen kann.
Die Informationen, welche Datei editiert werden muss und welche Zeilen hinzugefügt werden sollen und an welcher Position die Zeilen hinzugefügt werden sollen, sollten möglichst benutzerfreundlich im Script selber eingetragen werden können.
z.B. so:
1 2 3 4 5 6 | #Datei in der gesucht werden soll: Dateiname1 #Suchstring: Suchzeile1 #einzufügende Zeilen: Zeile1, Zeile2, Zeile3 |
Und jetzt kommt meine Frage bzw. das Problem:
Wenn der Suchstring (oder die einzufügenden Zeilen) Sonderzeichen und ' ' und "" enthält kann das nicht verarbeitet werden.
Zum Beispiel soll als Zeile folgendes hinzugefügt werden:
1 | g.h"f*$g"fd'd/f'f\g |
Also würde folgendes im Teil des Protokolls stehen:
1 2 3 4 5 6 | #Datei in der gesucht werden soll: Dateiname1 #Suchstring: Suchzeile1 #einzufügende Zeilen: g.h"f*$g"fd'd/f'f\g, Zeile2, Zeile3 |
Ich weiss, dass eine Zeile g.h"f*$g"fd'd/f'f\g keinen Sinn macht. Aber ich habe es mir erspart eine sinnvolle Zeile auszudenken. Ich meine es kann doch sein, dass ich in eine config Datei eine Zeile einfügen will, die unter anderem sowohl "-Zeichen enthält, wie auch '-Zeichen enthält und vielleicht noch andere Sonderzeichen.
Natürlich könnte ich anstatt g.h"f*$g"fd'd/f'f\g zu protokollieren die Zeile folgendermassen protokollieren:
1 | 'g.h"f*$g"fd'\''d/f'\''f\g' |
Auf diese Weise würde sed die Zeile wohl so in die Datei einfügen, wie gewünscht. Aber oben habe ich gesagt, dass ich es sehr benutzerfreundlich machen will. Das heisst, im Protokoll Teil soll sich der Benutzer nicht überlegen müssen, ob er etwas maskieren muss, ob er das ganze in Gänsefüsschen setzten muss, ob er vielleicht das ganze in '-Zeichen setzen muss oder ob er vielleicht den String aufteilen muss wie beim obigen Beispiel.
Ich stelle mir das so vor, dass das Script selber die notwendige Veränderung vornimmt, damit die einzufügende Zeile schliesslich so aussieht, dass sie in der Datei genau so ankommt, wie sie protokolliert wurde.
Ich stelle mir das also etwa so vor, dass das Script selber die Zeile, die vom Benutzer so eingegeben wurde ... g.h"f*$g"fd'd/f'f\g ... nach ... 'g.h"f*$g"fd'''d/f'''f\g' konvertiert, so dass die Zeile von sed problemlos verarbeitet werden kann.
Geht das? Oder verschiebt sich dann das Problem nicht einfach?
Also noch einmal: Was will ich im Kern?
Der Nutzer soll die Änderung im Script protokollieren können ohne sich Gedanken über die Form/Formatierung/Maskierung machen zu müssen.
Eine config-Zeile kann auch ' und " und andere Sonderzeichen in ein und der selben Zeile enthalten.
Die config-Zeile, soll so in die Datei im neuen System eingefügt werden, dass nichts verloren geht. Keine Sonderzeichen, keine " und keine '
Ist das überhaupt möglich? Oder kann man so ein Programm gar nicht schreiben? Übersteigt das die Möglichkeiten von Bash?
Antworten würden mich freuen. Besten Dank.