Nach Muster in Datei suchen und durch Variable ersetzen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von ploki, 31.03.2009.

  1. ploki

    ploki Jungspund

    Dabei seit:
    31.03.2009
    Beiträge:
    16
    Zustimmungen:
    0
    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! :)
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Gast123, 31.03.2009
    Gast123

    Gast123 Guest

    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.
    
     
  4. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    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.
     
  5. kworx

    kworx Jungspund

    Dabei seit:
    05.08.2008
    Beiträge:
    15
    Zustimmungen:
    0
    Wie rikola bereits schrieb, muss vor das $ ein \.
    Code:
    Systemname=Linux
    sed -i s/\$\Systemname}/$Systemname/g Deine_Datei
    
    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. ?(
     
  6. ploki

    ploki Jungspund

    Dabei seit:
    31.03.2009
    Beiträge:
    16
    Zustimmungen:
    0
    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 :)
     
  7. #6 rikola, 01.04.2009
    Zuletzt bearbeitet: 01.04.2009
    rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    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.
     
  8. ploki

    ploki Jungspund

    Dabei seit:
    31.03.2009
    Beiträge:
    16
    Zustimmungen:
    0
    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:
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. kworx

    kworx Jungspund

    Dabei seit:
    05.08.2008
    Beiträge:
    15
    Zustimmungen:
    0
    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
    
    Da passt der Syntax nicht.
    $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" ]
    
     
  11. ploki

    ploki Jungspund

    Dabei seit:
    31.03.2009
    Beiträge:
    16
    Zustimmungen:
    0
    danke hat wunderbar geklappt :)
     
Thema: Nach Muster in Datei suchen und durch Variable ersetzen
Besucher kamen mit folgenden Suchen
  1. shell ersetzen shell variable

    ,
  2. variable suchen und ersetzen shell

    ,
  3. sed nach Muster suchen

    ,
  4. muster in dateie ersetzen
Die Seite wird geladen...

Nach Muster in Datei suchen und durch Variable ersetzen - Ähnliche Themen

  1. Textstring nach muster durchsuchen und in Variable speichern

    Textstring nach muster durchsuchen und in Variable speichern: Hallo, habe ein "kleines" Problem! ps -ef | grep mysql | grep GroupLabel | grep -v grep liefert: root 4298 1 0 Nov13 ? 00:00:00...
  2. Datei nach einem bestimmten Muster/Pattern durchsuchen und diese Werte anpassen?

    Datei nach einem bestimmten Muster/Pattern durchsuchen und diese Werte anpassen?: Hallo! Ich bin noch etwas neu in er Landschaft der Unix-Scripte. Nun habe ich folgende Aufgabenstellung vor die Füsse geworfen bekommen: Ich...
  3. bash - Datei nach Muster durchsuchen und bis Dateiende ersetzen/löschen

    bash - Datei nach Muster durchsuchen und bis Dateiende ersetzen/löschen: Ich wieder :brav: Meine Datei: #Muster1 TEXT TEXT TEXT #Muster2 TEXT TEXT BELIEBIG VIEL TEXT #Muster3 TEXT TEXT TEXT TEXT TEXT BELIEBIG...
  4. sed:suche nach Textmuster

    sed:suche nach Textmuster: Hi, also ich hab ein Dateistruktur,die folgendermaße aussieht: ein table und mehrer Absätze sowas hier: <p class="text2"> <a...
  5. Keine Benachrichtigungen im Vollbild Modus

    Keine Benachrichtigungen im Vollbild Modus: Arch Linux Plasma 5.8 Weiss einer ob das gehen sollte, bzw kann mal einer testen ob es bei ihm geht, gerne auch mit anderen kde/plasma versionen....