staging.inyokaproject.org

Linux Bash: Kampf mit " und ' (und Sonderzeichen)

Status: Ungelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

Umaash

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

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.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Ich würde das mit diff und patch lösen - und nicht mit sed. Man könnte z.B. vor dem Editieren die zu ändernde Datei nach $file.orig kopieren und dann so etwas wie diff -U 5 "$file.orig" "$file" nutzen und die Ausgabe speichern.

Vielleicht gibt es auch eine gute Lösung mit Ansible.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

rklm schrieb:

Vielleicht gibt es auch eine gute Lösung mit Ansible.

Ansible kennt lineinfile und blockinfile - dann muss man sich statt dem Escaping in der Shell halt mit der korrekten Syntax für multiline-Strings in YAML-Dateien für die Tasks herumschlagen (oder die Strings extra aus einer Datei einlesen) - aber der Vorteil ist, dass man idempotente Operationen bekommt (wenn man sich an die Best Practices hält), d.h. man kann ein Playbook beliebig oft laufen lassen, um einen definierten Zustand zu erreichen.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Oder vielleicht so?:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash


Code mit dem Befehl sed, der die Daten (die am Schluss stehen und auskommentiert sind) aus seiner eigenen Datei ausliest und das erste Zeichen (#) löscht.


#Es folgt die Datenbank

#Edit1
#/etc/Datei1
#Suchstring1 mit 'Zeichen und "Zeichen und Sonderzeichen und Befehlen und Variablen
#einzufügende Zeile A mit 'Zeichen und "Zeichen und Sonderzeichen und Befehlen und Variablen
#einzufügende Zeile B mit 'Zeichen und "Zeichen und Sonderzeichen und Befehlen und Variablen

#Edit2
#/etc/Datei2
#Suchstring2 mit 'Zeichen und "Zeichen und Sonderzeichen und Befehlen und Variablen
#einzufügende Zeile A mit 'Zeichen und "Zeichen und Sonderzeichen und Befehlen und Variablen

#Edit3
#/etc/Datei3
#Suchstring3 mit 'Zeichen und "Zeichen und Sonderzeichen und Befehlen und Variablen
#einzufügende Zeile A mit 'Zeichen und "Zeichen und Sonderzeichen und Befehlen und Variablen
#einzufügende Zeile B mit 'Zeichen und "Zeichen und Sonderzeichen und Befehlen und Variablen
#einzufügende Zeile C mit 'Zeichen und "Zeichen und Sonderzeichen und Befehlen und Variablen

?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Umaash schrieb:

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.

Eine Configdatei auf /? Im Wurzelverzeichnis? Da sind normalerweise keine Configdateien, sondern in /etc, dort aber, was die Sache verkompliziert, teils in Unterverzeichnissen.

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.

Und wenn das Editieren ein Ändern oder Löschen war, nicht?

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.

Eine Scriptdatei, die Du führst, halte ich fest.

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.

Klingt soweit machbar.

1
sed -i 3i 192.168.99.4 umaash /etc/hosts

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.

Klingt widersinnig. Wenn die Information i.d. Datei steht, dann braucht man nicht den Dateinamen, das ist ja der Name der Datei, in der es drinsteht. Die Position wäre dann auch einfach vor oder nach der Stelle, an der es drinsteht.

Führst Du jetzt ein Script oder holt sich das Script die Infos, in dem es alle Configfiles abklappert?

Im Script könnte beispielsweise stehen:

1
2
3
4
5
6
7
# {##umaash##} +2 
frompel=himpel
ox=9 
pi=4
# set your RDBMS, default: hsqldb 
# {##umaash##} m1 
xydb=postgresql

um zu sagen, in der Datei, in der dieser {##umaash##}-Marker steht, sind an der Stelle 2 Zeilen einzufügen und an der nächsten ist eine zu modifizieren.

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

Wenn Du aber eine Datei führst, in der die Änderungen verbatim drinstehen, dann ginge ja

1
2
3
4
5
6
/etc/hosts 3 i 192.168.99.4 umaash /etc/hosts
/etc/hosts 4 i 192.168.99.1 router /etc/hosts
/etc/papersize 1 m a4 us-letter
/etc/facebookid 3 d
/etc/facebookid 4 d
/etc/facebookid 5 d

Und für schwierige Änderungen mit Sonderzeichen:

1
2
/etc/fooservice 3 d
/etc/facebookid 3 i g.h"f*$g"fd'd/f'f\g

Der Nutzer soll die Änderung im Script protokollieren können ohne sich Gedanken über die Form/Formatierung/Maskierung machen zu müssen.

Bist Du der einzige Nutzer, oder soll das auch von anderen genutzt werden können? Es gibt ja Updates der Configfiles, bei denen auch Zeilen dazukommen oder verschwinden können, vielleicht nur Kommentare, dann kommt die Nummerierung aus dem Tritt. Bei vielen Konfigurationsdateien ist die Reihenfolge der Einträge unerheblich, bei vielen aber auch nicht.

Ist das überhaupt möglich? Oder kann man so ein Programm gar nicht schreiben? Übersteigt das die Möglichkeiten von Bash?

Man kann jedes Programm schreiben, das sich widerspruchsfrei beschreiben lässt. Aber gut - nicht jeder kann es mit jeder Sprache.

Man könnte auch jede Änderung, die das Programm vornehmen will, mit 3 Zeilen davor und danach anzeigen, und es den User mit Enter absegnen lassen, dann hat er vielleicht 10 Dateien, von denen er 8 absegnet und eine, bei der er es doch im Editor von Hand machen muss, aber den Vorschlag als Kommentar schon eingepastet bekommt, so dass er nur marginale Korrekturen vornehmen muss, sowie eine, bei der Hopfen und Malz verloren ist, wo er ganz auf sich gestellt ist, aber in einem Log sieht, welches Problem nicht gelöst werden konnte.

Ansonsten geht meine Überlegung auch zu diff-und-patch.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Danke. Erstmal noch ein paar Klärungsversuche zu meinem obigen Text.

Eine Configdatei auf /? Im Wurzelverzeichnis? Da sind normalerweise keine Configdateien, sondern in /etc, dort aber, was die Sache verkompliziert, teils in Unterverzeichnissen.

Ja genau im Wurzelverzeichnis oder in einem Unterordner von Wurzelverzeichnis (z. B. in /etc).

Und wenn das Editieren ein Ändern oder Löschen war, nicht?

Doch, daran habe ich noch gar nicht gedacht.

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.

Eine Scriptdatei, die Du führst, halte ich fest.

Das habe ich etwas unpräzise ausgedrückt. Erstens habe ich ja diese Scriptdatei noch gar nicht. Zweitens wird diese Scriptdatei aus 2 Teilen bestehen. Der erste Teil ist das Script, dass die Änderungen wieder in die entsprechenden Dateien auf "/" einfügen wird, wenn ich das System gewechselt habe. Der 2te Teil ist das Protokoll aller Änderungen, die ich damals im alten System im Wurzelverzeichnis vorgenommen habe. Den ersten Teil muss ich ja nicht (nach)führen. Wenn das Script einmal geschrieben ist, dann bleibt es wie es ist. Aber den 2ten Teil werde ich nachführen bzw. erstellen. Z.B. am Schluss der Datei mit Info welche Datei betroffen ist, wo eingefügt wrden muss und was eingefügt werden muss.

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.

Klingt widersinnig. Wenn die Information i.d. Datei steht, dann braucht man nicht den Dateinamen, das ist ja der Name der Datei, in der es drinsteht. Die Position wäre dann auch einfach vor oder nach der Stelle, an der es drinsteht.

Die Information steht in der gleichen Datei in der auch das Script ist. Das Script liest diese Information aus und fügt die Zeilen wieder in die entsprechenden Dateien in "/" ein.

Führst Du jetzt ein Script oder holt sich das Script die Infos, in dem es alle Configfiles abklappert?

Das habe ich etwas unpräzise formuliert. Das Script selber muss ich ja nicht mehr nachführen, wenn das mal richtig geschrieben ist. Aber die Informationen in welcher Datei welche Einträge hinzugefügt werden müssen und an welcher Stelle, die stehen ja in der gleichen Datei, wie das Script. Und diese müssen nachgeführt werden, wenn ich wieder eine neue Änderung in "/" vorgenommen habe.

Der Nutzer soll die Änderung im Script protokollieren können ohne sich Gedanken über die Form/Formatierung/Maskierung machen zu müssen.

Bist Du der einzige Nutzer, oder soll das auch von anderen genutzt werden können? Es gibt ja Updates der Configfiles, bei denen auch Zeilen dazukommen oder verschwinden können, vielleicht nur Kommentare, dann kommt die Nummerierung aus dem Tritt. Bei vielen Konfigurationsdateien ist die Reihenfolge der Einträge unerheblich, bei vielen aber auch nicht.

Ich bin der einzige Nutzer. Eine Nummerierung braucht es nicht, denn um die Stelle fürs Einfügen zu finden, sucht ja das Script nach der Zeile, unter welcher eingefügt werden soll. Und woher weiss das Script unter welcher Zeile eingefügt werden soll? Das steht ja am Schluss in der gleichen Datei in der auch das Script ist. Das habe ich ja protokolliert, als ich die Änderung vorgenommen habe.

Führst Du jetzt ein Script oder holt sich das Script die Infos, in dem es alle Configfiles abklappert?

Das Script muss keine Configfiles abklappern, da die Infos alle im 2ten Teil des Scripts integriert sind.

Aufgrund Deiner Fragen scheint es mir, dass du einen komplett anderen Ansatz im Kopf hast. Vielleicht ist der besser. Ich werde jedenfalls dein Post noch einmal aufmerksam durchlesen.

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 154

Hallo,

Vielleicht könnte etckeeper was für dich sein. Schau mal unter: https://www.heise.de/ratgeber/Linux-Konfigurationsdateien-mit-Etckeeper-verwalten-4190729.html

Gruß

Carsten

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

rklm schrieb:

Ich würde das mit diff und patch lösen - und nicht mit sed. Man könnte z.B. vor dem Editieren die zu ändernde Datei nach $file.orig kopieren und dann so etwas wie diff -U 5 "$file.orig" "$file" nutzen und die Ausgabe speichern.

Ich habe es mit dem Diff Befehl versucht. Aber der scheint sich nicht zu eignen, wenn man in der Originaldatei einen bestimmten Zeilenblock rauslöschen will.

In der Originaldatei steht folgendes...

1
2
3
4
5
6
[...]
a
b
c
d
[...]

In der "modifizierten" Datei steht folgendes...

1
2
b
c

In beiden Dateien kommt also ...

1
2
b
c

... vor.

Nun möchte ich das, was in beiden Dateien vorkommt in der Originaldatei löschen und den Rest behalten. Das Script sollte selber die ganze Originaldatei absuchen, wo der Zeilenblock b \n c vorkommt. und ihn dann herauslöschen. Wenn dieser Zeilenblock mehrmals vorkommt, dann soll er mehrmals herausgelöscht werden.

Der Diff-Befehl scheint aber nur folgendes zu können:

– nämlich a \n d aus der Originaldatei entfernen.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

user_unknown schrieb:

Eine Configdatei auf /? Im Wurzelverzeichnis? Da sind normalerweise keine Configdateien, sondern in /etc, dort aber, was die Sache verkompliziert, teils in Unterverzeichnissen.

Das verkompliziert die Sache nicht, weil ja der Benutzer auch den Pfad inklusive der Datei im Script zur Verfügung stellt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Umaash schrieb:

Der Diff-Befehl scheint aber nur folgendes zu können:

– nämlich a \n d aus der Originaldatei entfernen.

Ich hatte verstanden, Du willst Änderungen an Dateien machen und diese Änderungen aufheben, damit Du die nochmal anwenden kannst. Dafür sind diff und patch gedacht.

Jetzt scheint es mir eher so zu sein, dass Du Anweisungen aufschreiben willst, nach denen Dateien verändert werden sollen. Dann brauchst Du natürlich eher so etwas wie sed. Dann vergiss diff und patch.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Ja, genau. Ich will Änderungen die ich in einem alten Linux gemacht habe manuell protokollieren. Dann sollen diese Änderungen automatisch im neuen Linux vorgenommen werden, damit ich diese nicht wieder von Hand vornehmen muss. Aufheben will und muss ich die Änderungen aber nirgends.

tomtomtom Team-Icon

Supporter
Avatar von tomtomtom

Anmeldungsdatum:
22. August 2008

Beiträge: 55572

Umaash schrieb:

Das verkompliziert die Sache nicht, weil ja der Benutzer auch den Pfad inklusive der Datei im Script zur Verfügung stellt.

Wobei natürlich zu beachten wäre, dass sich in den letzten Jahren nicht wenige systemweite Konfigurationspfade geändert haben.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

tomtomtom schrieb:

Umaash schrieb:

Das verkompliziert die Sache nicht, weil ja der Benutzer auch den Pfad inklusive der Datei im Script zur Verfügung stellt.

Wobei natürlich zu beachten wäre, dass sich in den letzten Jahren nicht wenige systemweite Konfigurationspfade geändert haben.

OK. Wenn es so gemeint war, stimmt das natürlich.

Zurück zu dem was ich will:

Im Script (oder in einer separaten Datei) sind also die Änderungen protokolliert, die auch wieder auf das neue Linux übertragen werden sollen. Dieses Protokoll sieht etwa so aus:

 -Datei:
 /etc/environment
 -löschen:
 aaaa
 bbbbb
  
 -Datei:
 /etc/XX3
 -einfügen nach:
 uuu
 -einzufügende Zeilen:
 cds
 ods
 zae
 
 -ignoriere:
 -Datei:
 /etc/XX12
 -ersetzten:
 fdsd
 dsa
 -durch:
 eeeeeee

Den Script-Teil zum einlesen dieses Protokolls in Variablen habe ich bereits geschrieben. Jetzt müssen nur noch die Änderungen in den Dateien vorgenommen werden. Aber mit welchen Befehlen geht das am besten?

Es gibt also "löschen", "ersetzen" und "einfügen".

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1303

Hallo Umaash,

mal ein anderer gedanklicher Ansatz:

  • Du nutzt "vi" als Editor bei der Änderung deiner Datei und lässt die Editor-Sitzung mitloggen.

  • Den Inhalt des Log-Files kannst du in deiner zentralen Änderungsdatei speichern und von dort wieder extrahieren.

  • Die Änderungs-Session kannst du dann später wiederholen.

Beispiel:

$ # Erstelle eine Quell-Datei
$ for i in {01..10}; do echo "Zeile-$i" >>x.txt; done
$ # Ändere die Datei x.txt und speichere die Session in x.log
$ vi -w x.log x.txt
$ # Zeige die vi Befehle und gedrückten Tasten, die in x.log gespeichert wurden
$ xxd x.log
00000000: 6a6a 4120 4469 6573 6572 2054 6578 7420  jjA Dieser Text 
00000010: 6973 7420 616e 6765 66c3 bc67 741b 6767  ist angef..gt.gg
00000020: 690d 1b6b 692d 2d20 4469 6520 4564 6974  i..ki-- Die Edit
00000030: 7365 7373 696f 6e20 7769 7264 2069 6e20  session wird in 
00000040: 782e 6c6f 6720 6d69 7467 6573 6368 7269  x.log mitgeschri
00000050: 6562 656e 202d 2d1b 303a 2573 2f65 2d30  eben --.0:%s/e-0
00000060: 2f65 202d 2030 2f0d 4741 0d2a 2a45 6e64  /e - 0/.GA.**End
00000070: 652a 2a0d 1b3a 7721 2078 782e 7478 740d  e**..:w! xx.txt.
00000080: 3a71 210d 0a                             :q!..
$ # Das Original wurde nicht verändert, der modifizierte Inhalt ist xx.txt
$ # Nun wird xx.txt gelöscht und über x.log aus x.txt erneut erstellt
$ rm xx.txt
$ vi -s x.log x.txt
$ cat xx.txt
-- Die Editsession wird in x.log mitgeschrieben --
Zeile - 01
Zeile - 02
Zeile - 03 Dieser Text ist angefügt
Zeile - 04
Zeile - 05
Zeile - 06
Zeile - 07
Zeile - 08
Zeile - 09
Zeile-10
**Ende**

$ 

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Mit Ansible (in einer aktuellen Version, was bei Ubuntu 20.04 in den Quellen ist, ist arg alt) könnte das so aussehen:

playbook.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
---

- name: System configuration changes
  become: true
  hosts: 127.0.0.1
  connection: local

  tasks:
    - name: delete lines from /etc/environment matching whole lines
      ansible.builtin.lineinfile:
        path: /etc/environment
        state: absent
        regexp: '^{{ item }}$'
      loop:
        - aaaa
        - bbbbb

    - name: insert block surrounded by markers in /etc/XX3 after a given string
      ansible.builtin.blockinfile:
        path: /etc/XX3
        insertafter: uuu
        maker: "# {mark} ANSIBLE MANAGED BLOCK"
        block: |
          cds
          ods
          zae

    - name: replace two lines in /etc/XX12
      ansible.builtin.replace:
        path: /etc/XX12
        regexp: '^fdsd\ndsa$'
        replace: eeeeeee

Ausführung dann so (sudo-Passwort auf Nachfrage eingeben):

ansible-playbook -K playbook.yml 
Antworten |