FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

sed never ending nightmare

sed never ending nightmare 2009-12-12 15:32
00
hey infos,

möchte gerne bei einer File "form.tmpl"

den Ausdruck $input mit einem Text beliebiger länge ersetzen.

In sed kann man ja so mehrere Zeilen einfügen:
!/bin/sh sed ' /WORD/ a\ Add this line\ This line\ And this line 'Diese Zeilen sollen ja aber aus einem File "text.inp" kommen und das File soll beliebig groß sein,
wie schaffe ich das innerhalb eines bash-skriptes ?

Wenn ich alles aus text.inp zeilenweise einlese und jeweils ein \ einfüge und so alles in eine $var
packe, schaffe ich es nicht das innerhalb von sed zu nutzen.

gruß 00

RE: sed never ending nightmare 2009-12-14 00:46
4stuebs
Ich würde jetzt raten, dass Du die $var nicht benutzen kannst, weil die Leerzeichen und Zeilenumbrüche das kaputtmachen. Probier sonst mal "$var" statt der \ am Ende der Zeile.

sed "/WORD/$var/"Die " sind weicher als ' und erlauben das einsetzen von Variablen.

Sonnige Grüße,
Marius

RE: sed never ending nightmare 2009-12-14 11:52
Anonymer User
omg. sed is so 1960s.
cat text.inp | python -c "import sys; print sys.stdin.read().replace('WORD', 'FOO\nBAR')"

RE: sed never ending nightmare 2009-12-14 22:18
00
Ich würde jetzt raten, dass Du die $var nicht benutzen kannst, weil die Leerzeichen und Zeilenumbrüche das kaputtmachen. Probier sonst mal "$var" statt der \ am Ende der Zeile.

sed "/WORD/$var/"Die " sind weicher als ' und erlauben das einsetzen von Variablen.

Sonnige Grüße,
Marius

mmh, ich versteh wirklich nicht was du meinst…

soll ich statt:
!/bin/sh sed ' /WORD/ a\ Add this line\ This line\ And this line '
für jedes \ ein " setzen ??

!/bin/sh sed ' /WORD/ a" Add this line" This line" And this line '
…das kommt mir spanisch vor…

oder meinst du statt:

/Word/$regex/ -> "Word"$regex"

Oder " statt ' ? '/Word/$regex/' -> "/Word/$regex/"

bin echt verwirrt…

RE: sed never ending nightmare 2009-12-14 22:49
anonym
Er meinte, dass doppelte Anfuehrungszeichen (") weicher sind als einfache Anfuehrungszeichen ('), da Variablen innerhalb doppelter Anfuehrungszeichen ausgewertet werden. Daher waere die Idee, dass Du Deinen Text vorher in eine Variable einliest und dann diese Variable in sed benutzt.

RE: sed never ending nightmare 2009-12-14 22:59
Loom
also wenn '/Word/$regex/' nicht geht liegt es daran, dass die Hochkommata das Dollarzeichen als $ belässt. Die Anführungszeichen werten das $ jedoch als Variable aus (daher weicher, da mehr Sonderzeichen erlaubt sind und nicht hart jedes Zeichen so bleibt wie es ist).

RE: sed never ending nightmare 2009-12-15 09:50
NaZo
Oder " statt ' ? '/Word/$regex/' -> "/Word/$regex/"

Ja, das.

RE: sed never ending nightmare 2009-12-15 15:38
Anonymer User
mmmh, mmh, mmmh

also erstmal danke für die Hilfe, aber bis jetzt komme ich damit nicht weiter,
solche Sachen wie " statt ' habe ich tatsächlich schon vorher versucht, sitze ja schon ne Weile dran…

Ich glaube ich erkläre nochmal ausführlicher:

Ich habe eine Datei "doc.tmpl" mit z.B folgendem Inhalt:

${header} ${body}
Dort möchte ich das Tag ${body} durch einen Text ersetzen, dieser kann unterschiedlich lang sein und somit über mehrere Zeilen gehen, auch dürfen dort "\" erscheinen !
also z.B. ersatz.txt
\comment blabla
Ich möchte also irgendwie ein sed-Konstrukt derart
cat doc.tmpl | sed -e "s@\${body}@$body_content@g" > output.txt anwenden.

Die Frage ist also wie ich ersatz.txt sinnvoll in $body_content einsetze,
so dass dieses sed-Konstrukt oder ähnl. ohne Fehlermeldung ersetzt !!

Habe verschiedene Sachen versucht,aber funktioniert so wie ich möchte :((

gruß 00

RE: sed never ending nightmare 2009-12-15 19:53
4stuebs
Wow, dafür willst Du also sed benutzen? Sieht aus wie ein Webserver in bash. Das klingt mutig.

Also, dein Problem ist, dass Du die Variable quoten musst, weil eine Leerzeile drin ist, sie aber gleichzeitig nicht quoten kannst, weil die Variable ja ersetzt werden muss. Somit bleibt Dir wohl nur noch, die Zeilenumbrüche und \ einzeln zu escapen.

Also zuerst die \ escapen, dann Zeilenumbrüche durch \n ersetzen:
cat ersatz.txt | sed -e 's/\\\\/\\\\\\\\/g' | sed -e ':;s/\\n/\\\\n/;N;T'
So wird aus
\comment blablaein wunderschönes
\\\\comment\nblabla
Das kannst Du als Replacement für sed benutzen. Zusammen hieße das also:
sed -e 's@${body}@'$(cat ersatz.txt | sed -e 's/\\\\/\\\\\\\\/g' | sed -e ':;s/\\n/\\\\n/;N;T')'@g' abc.txt
Was natürlich nicht funktioniert, wenn Du @ in der ersatz.txt hast. Hast Du? Dann würde ich wieder auf / umsteigen, und die / escapen wie ich das mit den \\ und \n anderen Zeichen getan habe.

Die Lösung ist allerdings nicht sehr schön und sicher auch nicht Unicode-Kompatibel. Du möchtest tatsächlich lieber eine Skriptsprache wie python benutzen, die nativ mit Unicode-Strings umgehen kann - im Gegensatz zur bash ;)

Sonnige Grüße,
Marius

(edit: die code-Klammern haben die Hälfte meiner \\\\\ rauskürzt - ihr Schweine!)

RE: sed never ending nightmare 2009-12-16 23:21
00
Vielen Dank, das hat geklappt! :))