Bash: sed einfügen multiline, Problem mit Zeileneinrücken

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ren22

Bash: sed einfügen multiline, Problem mit Zeileneinrücken

Beitrag von ren22 » 07.05.2020 08:26:23

Hallo,

wie kann man mit sed im einfüge Modus mehrere Zeilen einfügen(multilines), den Code leserlich lassen mit Zeileneinrückungen, aber den einzufügen Code nicht mit mehr Leerzeichen zusätzlich vergrößern, nach dem einrücken ?

Was ich meine ist folgendes:
Also ohne einrückungen sieht ja eine normale Funktion, lesbar so geschrieben aus:

Code: Alles auswählen

meine_funktion()
{
    sed -i '' '/<\/foobar>/i \
    <obst>\
      <beschreibung>gelb und lecker</beschreibung>\
      <menge>KG</menge>\
      <wert>5</wert>\
    </obst>\
' bananen.txt
}
Ich möchte gerne die Funktion noch mit einer case Anweisung erweitern und den Code aber gerne leserlich mit eingerücken Zeilen haben, allerdings habe ich dann das Problem das die Abstände beim einfügen nicht mehr stimmen, die Original Funktion hat vor den <Tag's>: <obst> & </obst> 4 Leerzeichen und die restlichen <Tag's>: <beschreibung><menge><wert> 6 Leerzeichen vor den <Tag's> , wenn der Code in die Zieldatei geschrieben wird.

Code: Alles auswählen

meine_funktion()
{
    case "$1" in
    banane*)
            sed -i '' '/<\/foobar>/i \
            <obst>\
               <beschreibung>gelb und lecker</beschreibung>\
               <menge>KG</menge>\
               <wert>5</wert>\
            </obst>\
            ' bananen.txt
    ...code...
    esac
}
Wie man in der zweiten Abbildung sieht sind die Leerzeichen vor den <Tag'> auch größer geworden.

Vielen Dank!

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash: sed einfügen multiline, Problem mit Zeileneinrücken

Beitrag von Meillo » 07.05.2020 08:37:56

ren22 hat geschrieben: ↑ zum Beitrag ↑
07.05.2020 08:26:23
wie kann man mit sed im einfüge Modus mehrere Zeilen einfügen(multilines), den Code leserlich lassen mit Zeileneinrückungen, aber den einzufügen Code nicht mit mehr Leerzeichen zusätzlich vergrößern, nach dem einrücken ?
Gar nicht.

Wenn du in gequoteten Strings (und das ist das sed-Befehlsargument) Whitespace hast, dann ist der Teil des Strings.

(Nur im Falle von Heredocs kann man fuehrende Tabs entfernen lassen, wenn man nach den zwei Kleinerzeichen ein Minus einfuegt.)

Du koenntest halt mit Variablen oder Funktionen arbeiten, um den Text aus der Verschachtelungstiefe rauszukommen.

Grundsaetzlich waere fuer XML-Bearbeitung ein XML-Tool wie xmlstarlet besser geeignet als sed.
Use ed once in a while!

ren22

Re: Bash: sed einfügen multiline, Problem mit Zeileneinrücken

Beitrag von ren22 » 07.05.2020 08:52:47

Hallo Meillo,
Du koenntest halt mit Variablen oder Funktionen arbeiten, um den Text aus der Verschachtelungstiefe rauszukommen.
einen kleinen Anreiz/Beipiel dazu hast Du nicht zufällig auf Lager?

PS: würde gerne nur bei 'bash/shell & sed' bleiben, keep it small and simple, sollen nicht unnötig viele Programme später auf dem Zielsystem laufen.
Danke

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash: sed einfügen multiline, Problem mit Zeileneinrücken

Beitrag von Meillo » 07.05.2020 10:02:48

ren22 hat geschrieben: ↑ zum Beitrag ↑
07.05.2020 08:52:47
Du koenntest halt mit Variablen oder Funktionen arbeiten, um den Text aus der Verschachtelungstiefe rauszukommen.
einen kleinen Anreiz/Beipiel dazu hast Du nicht zufällig auf Lager?
Das Problem das du doch hast, ist die zusaetzliche Schachtelungstiefe durch das case. Wenn du den sed-Befehl in eine eigene Funktion packst, dann kannst du dadurch erreichen, dass der Code immer auf oberster Ebene *steht*, egal wie tief verschachtelt die Funktion *aufgerufen* wird. Das ist natuerlich ein Umweg auf dem man mehr zufaellig das Gewuenschte erreicht, aber das reicht ja vielleicht.

Code: Alles auswählen

insert_banane()
{
    sed -i '' '/<\/foobar>/i \
    <obst>\
       <beschreibung>gelb und lecker</beschreibung>\
       <menge>KG</menge>\
       <wert>5</wert>\
    </obst>\
    ' bananen.txt
}

meine_funktion()
{
    case "$1" in
    banane*)
            insert_banane
    ...code...
    esac
}
Oder mit einer Variable:

Code: Alles auswählen

inserttxt='
    <obst>\
       <beschreibung>gelb und lecker</beschreibung>\
       <menge>KG</menge>\
       <wert>5</wert>\
    </obst>\
'

meine_funktion()
{
    case "$1" in
    banane*)
	    sed -i '' '/<\/foobar>/i \
	    '"$inserttxt"'
	    ' bananen.txt
    ...code...
    esac
}

PS: würde gerne nur bei 'bash/shell & sed' bleiben, keep it small and simple, sollen nicht unnötig viele Programme später auf dem Zielsystem laufen.
Kann ich verstehen, aber du musst dann auch selber dran denken die Werte zu xml-escapen, falls noetig. Ich wollte es auch nur zu Bedenken geben. Falls du oefters und mehr mit XML machst, lohnt es sich, ein XML-Tool zu verwenden. Das bietet letztlich deutlich mehr Zuverlaessigkeit. Wenn du naemlich anfangen musst, Input zu escapen und generiertes XML zu validieren oder gar XML aus anderen Programmen uebernimmst, dann ist es mit nur sed schon bald gar nicht mehr small and simple. Aber fuer ein kleines Helferlein, bei dem es ausreicht, wenn es zu 95% funktioniert, kannst du ruhig erstmal so weiter machen. Ich mache das auch je nach Fall mal so mal so.
Use ed once in a while!

Antworten