Nach Muster in Datei suchen und durch Variable ersetzen

P

ploki

Jungspund
Hallo,

ich bekomme es einfach nicht hin, ich will in meinem Script
eine Datei durchsuchen nach ${xxxxx} und die dann durch eine Variable
mit dem gleichen Name ersetzen, also ${xxxxx} ...

also ich habe das Problem dass in der Datei die Variablen nicht ersetzt werden und ich diese dann eben manuell (durch ein Skriptbefehl) ersetzen will.

z.B. im skript ist die Variable: ${Systemname} und die ist z.B. "Linux"
in der Datei steht blablabla${Systemname}blablabla
jetzt soll in der Datei anstatt ${Systemname} -> Linux stehen.

Ich habe es schon mit verschieden sed und grep befehlen versucht, aber ich komm irgendwie nicht weiter. Kann man in der Datei nach Inhalten suchen die mit ${ beginnen und mit } aufhören? Also normalerweise geht es ja bei sed mit s/${*}/ersetzer_Text/g , aber das funktioniert irgendwie nicht.

Wenn jemand mir weiterhelfen kann, wär ich sehr dankbar! :)
 
Sowas meinst du nicht, oder?

Code:
#! /bin/bash

sysname=Linux
echo Mein Betriebssystem, $sysname ist toll.
Code:
neumannr@dellpc:~/bin> ./name.sh
Mein Betriebssystem, Linux ist toll.
 
Wenn das Wort, nach dem Du mit grep, sed, usw. ein '$' enthaelt, so musst Du dieses durch '\$' ersetzen, da es sonst von der Shell interpretiert wird. Propier's mal.
 
z.B. im skript ist die Variable: ${Systemname} und die ist z.B. "Linux"
in der Datei steht blablabla${Systemname}blablabla
jetzt soll in der Datei anstatt ${Systemname} -> Linux stehen.

Wie rikola bereits schrieb, muss vor das $ ein \.
Code:
Systemname=Linux
sed -i s/\$\Systemname}/$Systemname/g Deine_Datei

Ich habe es schon mit verschieden sed und grep befehlen versucht, aber ich komm irgendwie nicht weiter. Kann man in der Datei nach Inhalten suchen die mit ${ beginnen und mit } aufhören? Also normalerweise geht es ja bei sed mit s/${*}/ersetzer_Text/g , aber das funktioniert irgendwie nicht.

Auch wenn es nicht wirklich Sinn macht, meinst Du wohl das:
Code:
sed -i s/\${.*}/ersetzer_Text/g Deine_Datei
oder
Code:
sed -i s/\${.*}/$ersetzer_Variable/g Deine_Datei

Somit werden alle Variablen in der Datei, unabhängig vom Variablennamen, durch den vorgegeben Wert ersetzt. ?(
 
Danke schonmal für die Antworten :)

Wenn ich eine Variable direkt ändern will klappt das auch, aber mein Problem ist, dass ich das eben variabel machen will...

also das
Code:
 sed -i s/\${.*}/$ersetzer_Variable/g Deine_Datei

sollte so funktionieren, dass ich die Datei ganz durchgehe und das was zwischen ${.*} gefunden wurde eben durch genau das ersetze... :P
also wie z.B.:

Das ist in der Datei: blabla/blubb/${Variablenname}_bla/....
Und es soll dann genau mit dem gleichen Name, also hier ${Variablenname} ersetzt werden. Geht sowas überhaupt? Oder kann man wie in diesem Beispiel "Variablenname" irgendwie aus der sed Anweisung rausschneiden? :think:

Ich hoff ihr versteht langsam mein Problem und ich wär sehr dankbar für weitere Hilfen :)
 
Ich gebe mal wieder, wie ich Dein Problem verstehe. Du hast eine Datei, in der z.B. steht
Code:
Ein ${Farbe1} Haus.
Ein ${Farbe2} Schimmel.
Und irgendwoher haben die Variablen ausserhalb der Datei nun bestimmte Werte, z.B. "Farbe1=gruenes" und "Farbe2=weisser" und Du moechtest mittels sed diese Werte nun einsetzen lassen - in einem Durchlauf, also NICHT so etwas wie
Code:
sed "s/\${Farbe1}/$Farbe1/g" Datei.text
sed "s/\${Farbe2}/$Farbe2/g" Datei.text
usw.

Allerdings faellt mir keine Loesung zu Deinem Problem ein: Die shell setzt Variablen ein, bevor sie an ein Programm weitergegeben werden, d.h., wenn sed nun einen Zeichenkette $myVariable findet, muesste man erst sed beenden, damit die shell $myVariable durch ihren Wert ersetzen kann und dies dann wieder erneut an sed uebergeben.

Eine Loesung dazu wuerde mich auch interessieren.
 
Zuletzt bearbeitet:
Ja das war mein Problem ^^
habs jetz versucht anders zu lösen, aber irgendwie dreh ich durch.

ich hab jetzt eine Datei in der steht ein string, folgendermaßen

list="
if ${Systemname} Linux
lalelu nur der
....
"

diese Datei habe ich mit source in das skript eingespeist, also wurde z.B. ${Systemname} durch Linux ersetzt.
Dann habe ich den 2. und 3. String mit cut ausgeschnitten
Code:
 ARG2=`echo $list | cut -d" " -f2`
ARG3=`echo $list | cut -d" " -f3`

und dann habe ich im Skript die beiden Argumente verglichen, also

Code:
if [ $Arg2 = $Arg3 ] then mach was else tu nichts fi

Das Problem ist, obwohl die beiden Argumente gleich sind mit echo, ist die if-Abfrage immer unwahr.:think:
 
Allerdings faellt mir keine Loesung zu Deinem Problem ein: Die shell setzt Variablen ein, bevor sie an ein Programm weitergegeben werden, d.h., wenn sed nun einen Zeichenkette $myVariable findet, muesste man erst sed beenden, damit die shell $myVariable durch ihren Wert ersetzen kann und dies dann wieder erneut an sed uebergeben.

Eine Loesung dazu wuerde mich auch interessieren.

So einen Fall hatte ich auch mal. Mit ein wenig c ist die Lösung eigentlich relativ einfach. ;)

Code:
#include <stdlib.h>

int main(int argc, char *argv[])
{
        char *var;

        if(argc!=2){
                printf("usage: %s <VARIABLE>\n", argv[0]);
                exit(EXIT_FAILURE);
        }


        if(var=(char *)getenv(argv[1])){
                printf("%s\n",var);
                exit(EXIT_SUCCESS);
        }

        return EXIT_FAILURE;
}

Das ganze dann einfach kompilieren zu z.B. getenv. getenv macht jetzt nichts anderes, als den Inhalt der übergebenen Umgebungsvarible auszugeben.

Damit lässt sich das Problem mit folgendem Einzeiler lösen.
Code:
for i in $(grep -oe \${.*} DEINE_DATEI |tr -d \$\{\}); do 
        sed -i s,\${$i},$(./getenv $i),g DEINE_DATEI;
done

ploki schrieb:
Code:
list="
if ${Systemname} Linux

Da passt der Syntax nicht.
ploki schrieb:
Code:
ARG2=`echo $list | cut -d" " -f2`
ARG3=`echo $list | cut -d" " -f3`
Code:
if [ $Arg2 = $Arg3 ] then mach was else tu nichts fi

$ARG2 ist nicht $Arg2 und $ARG3 ist nicht $Arg3. Zusätzlich solltest du " verwenden, da es bei leeren Variablen zu Fehlern (if [ = ]) kommt.
Code:
if [ "$ARG2" = "$ARG3" ]
 

Ähnliche Themen

Keine grafische Oberfläche (Debian Installation)

Wie komme ich an den Inhalt des Inhalts einer Variable?

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Unterschiedlichen Text in mehrere Dateien finden und löschen / ersetzen

.cfg Datei Analysieren und Zeilen Stellenweise abändern

Zurück
Oben