Gelöst: Mit sed Inhalt von einer Datei in eine andere ein..

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
hawkeye78
Beiträge: 430
Registriert: 10.09.2004 17:02:01
Wohnort: castrop-rauxel

Gelöst: Mit sed Inhalt von einer Datei in eine andere ein..

Beitrag von hawkeye78 » 27.07.2013 13:42:28

Hallo,

ich bin etwas ratlos. Ich habe folgendes Szenario:
$TEMP_FILE:

Code: Alles auswählen

Zeile 1
Zeile 2
Zeile 3
$TEMPLATE

Code: Alles auswählen

<html>
<head></head>
<body>
###content###
</body>
<html>
Nun würde ich gerne den Inhalt von TEMP_FILE an der Stelle von ###content### einfügen (sprich den Platzhalter durch den Inhalt ersetzen). Da ich das ganze in einem Shell-Script tun wollte, bot sich für mich an das ganze mit sed zu machen. Allerdings führen all meine Suchen im Netz und all mein Herumprobieren irgendwie ins leere und ich bin alles im allen ziemlich ratlos wie das genau funktioniert. Den das es funktioniert ist an einigen STelle im Netz dokumentiert und ich habe bis jetzt folgendes probiert:

Code: Alles auswählen

sed $TEMP_FILE -e "/{{content/d" $TEMPLATE

sed "s/content/`cat $TEMP_FILE`/" $TEMPLATE

sed '/content/r $TEMPLATE' $TEMP_FILE

sed $'/###content###/{r "$TEMPLATE"\nd}' "$TEMP_FILE"

sed '/###content###/ {
	r $TEMPLATE
	d

}' $TEMP_FILE

cat $TEMPLATE | sed -e '/###content###/{
	r $TEMP_FILE
	d
}'
Nur leider funktioniert keiner dieser Aufrufe und mir gehen so langsam die ideen aus welcher davon nun richtig ist und wo genau mein Fehler liegt.
Vielleicht mag mir ja jemand helfen oder kann mir zumindest einen kleinen Tipp geben ich würde mich auf jeden Fall sehr freuen.
Viele Grüße
Dan
Zuletzt geändert von hawkeye78 am 27.07.2013 18:41:47, insgesamt 1-mal geändert.
I love deadlines. I like the whooshing sound they make as they fly by - Douglas Adams

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Mit sed Inhalt von einer Datei in eine andere einfügen

Beitrag von rendegast » 27.07.2013 13:58:35

Hatten wir hier kürzlich.
Da Det Das einfachste wäre

Code: Alles auswählen

cat $TEMPLATE_HEAD $TEMP_FILE $TEMPLATE_END > newfile
Zuletzt geändert von rendegast am 27.07.2013 16:31:09, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

hawkeye78
Beiträge: 430
Registriert: 10.09.2004 17:02:01
Wohnort: castrop-rauxel

Re: Mit sed Inhalt von einer Datei in eine andere einfügen

Beitrag von hawkeye78 » 27.07.2013 14:01:32

Sprich aus der Template-Datei zwei Templates zu machen alles was vor dem eigentlich inhalt liegt und alles was danach kommt..... wäre auch eine Möglichkeit aber mich wundert es halt das man davon liest das es geht aber irgendwie keins der beispiele bei mir funktioniert
I love deadlines. I like the whooshing sound they make as they fly by - Douglas Adams

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Mit sed Inhalt von einer Datei in eine andere einfügen

Beitrag von goeb » 27.07.2013 17:43:08

hawkeye78 hat geschrieben:

Code: Alles auswählen

sed '/###content###/ {
	r $TEMPLATE
	d
}' $TEMP_FILE
Müsste gehen, wenn du die Variablen vertauscht und die richtigen Anführungszeichen verwendest. Aber nur wenn ###content### allein in einer Zeile steht. Siehe anderer Thread etwas weiter unten.

hawkeye78
Beiträge: 430
Registriert: 10.09.2004 17:02:01
Wohnort: castrop-rauxel

Re: Mit sed Inhalt von einer Datei in eine andere einfügen

Beitrag von hawkeye78 » 27.07.2013 18:12:05

Hallo goeb,

danke für deine Antwort, aber ich scheine irgendwas falsch zu machen darum habe ich mal ein minimales Beispiel zusammen gebastelt, vielleicht kannst Du (oder ein anderer Leser von diesem Thread) mir sagen wo der Fehler liegt.

Script: test.sh

Code: Alles auswählen

#!/bin/bash
# Erstellt anhand des Befehls "svn log" einen Changelog in einer HTML-Datei
# 27.07.2013: Script-Erstellung

PWD=`pwd`
TEMPLATE=$PWD/output.tmpl
TEMP_FILE=/tmp/input.tmp

sed '/###content###/ {
   r "$TEMP_FILE"
   d
}' $TEMPLATE

# Aufraeumen 
# rm $TEMP_FILE
HTML-Template: output.tmpl

Code: Alles auswählen

<html>
	<head>
		<title>
			title
		</title>
	</head>
	<body>
###content###
	</body>
</html>
Eingabedaten: input.tmp (diese werden im tatsächlichen Script per awk aus svn log geholt

Code: Alles auswählen

2013-07-26: Java-Algorithmus-Sammlung unter Versionskontrolle gestellt
2013-07-12: Theme-Ordner aktualisiert
2013-07-12: theme als vorbereitung zum update gelöscht und include geupdated
2013-07-12: include als vorbereitung zum update gelöscht
2013-07-10: Struktur für ein neues Template angelegt
2013-07-09: Perl-Script zum Sichern von SMS in eine MySQL-Datenbank ins Repository aufgenommen
2013-07-05: Aktuelle Version von cdc eingecheckt
2013-07-03: re-add license
2013-07-03: re-import of cdc project
2013-07-01: Inhalt von data hinzugefuegt
2013-07-01: Umstellen auf eine "saubere" Projektstruktur
Wenn ich das ganze jetzt aber ausführe, wird der ###content### einfach entfernt und es steht nur noch die HTML Datei da, also

Code: Alles auswählen

<html>
	<head>
		<title>
			title
		</title>
	</head>
	<body>
	</body>
</html>
Ich bin ehrlich gesagt ziemlich ratlos warum sich sed so verhält den ersetzt wird ja offenbar etwas bloß wandern nicht die Daten in die Ausgabe...
Viele Grüße
Dan
I love deadlines. I like the whooshing sound they make as they fly by - Douglas Adams

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Mit sed Inhalt von einer Datei in eine andere einfügen

Beitrag von Cae » 27.07.2013 18:31:37

r und {} oder Labels vertragen sich offensichtlich ueberhaupt nicht:

Code: Alles auswählen

$ cat /tmp/tmp.diz3Uf9XT3 
Sat Jul 27 18:21:41 CEST 2013
$ sed '/foo/ r /tmp/tmp.diz3Uf9XT3'
foo
foo
Sat Jul 27 18:21:41 CEST 2013
$ sed '/foo/ { r /tmp/tmp.diz3Uf9XT3;
> }'
foo
foo
$ sed '/foo/ t jmp; b; :jmp r /tmp/tmp.diz3Uf9XT3; d;'
foo
foo
$ 
Frag' mich nicht, wieso.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Mit sed Inhalt von einer Datei in eine andere einfügen

Beitrag von goeb » 27.07.2013 18:32:11

hawkeye78 hat geschrieben:danke für deine Antwort, aber ich scheine irgendwas falsch zu machen darum habe ich mal ein minimales Beispiel zusammen gebastelt, vielleicht kannst Du (oder ein anderer Leser von diesem Thread) mir sagen wo der Fehler liegt.
Hab ich doch schon: richtige Anführungszeichen verwenden, also " statt '. sed kann mit der Variable nichts anfangen, das muß die Shell machen. Im sed-Skript selbst brauchst du dann keine Anführungszeichen um die Variable (bzw. darfst sie gar nicht verwenden weil sed keine erwartet und sie als Teil des Dateinamens interpretiert).

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Mit sed Inhalt von einer Datei in eine andere einfügen

Beitrag von goeb » 27.07.2013 18:41:17

Cae hat geschrieben:

Code: Alles auswählen

sed '/foo/ { r /tmp/tmp.diz3Uf9XT3;
> }'
Kann nicht funktionieren, weil das Semikolon als Teil des Dateinamens interpretiert wird. Siehe auch:
http://pubs.opengroup.org/onlinepubs/009695399/utilities/sed.html hat geschrieben:

Code: Alles auswählen

Command verbs other than {, a, b, c, i, r, t, w, :, and # can be followed by a semicolon [...]
Cae hat geschrieben:

Code: Alles auswählen

$ sed '/foo/ t jmp; b; :jmp r /tmp/tmp.diz3Uf9XT3; d;'
Kann nicht funktionieren: t springt nur zum Label wenn (im aktuellen Durchgang) eine Ersetzung vorgenommen wurde. Wegen b springt sed dann direkt zum Ende.
Zuletzt geändert von goeb am 27.07.2013 18:45:51, insgesamt 2-mal geändert.

hawkeye78
Beiträge: 430
Registriert: 10.09.2004 17:02:01
Wohnort: castrop-rauxel

Re: Gelöst: Mit sed Inhalt von einer Datei in eine andere ei

Beitrag von hawkeye78 » 27.07.2013 18:43:25

Dann hatten wir ein bißchen an einander vorbeigeredet. Ich hatte vorher irgendwo in einem Forum gelesen das man die Variablen in Hochkommatas fassen muss damit sed damit klar kommt..... Aber mit den richtigen Zeichen funktioniert es jetzt.... vielen dank
I love deadlines. I like the whooshing sound they make as they fly by - Douglas Adams

Antworten