Über Shellscript Zeile in einem config-file ändern

  • Ich bräuchte öfter die Möglichkeit, mir von einem Skript Werte in einer simplen Textdatei (config-file) ändern zu lassen.

    z.B. eine Zeile
    "VERSION=x"
    auf
    "VERSION=y"
    ändern.

    Wie lässt sich sowas am einfachsten machen?

  • perl (der sed, awk, oder sonstwas) bietet sich für sowas an denk ich:

    Code
    > perl -p -i -e 's/VERSION=x/VERSION=y/g' textfile


    Das ersetzt alle Vorkommnisse von VERSION=x durch VERSION=y. Kann man auch beliebig komplexer machen, siehe perl-Doku oder so.

    Restrain the specimen!

  • warum kompliziert machen wenn du ersetzen machen kannst mit VIM...:devil:

    "Am Anfang war ich, und dann kamst du,
    und nun wird mir schlecht :-)):devil:
    "

  • Weil er von einem Skript gesprochen hatte, das er braucht. Und einen perl- (oder sed-, oder awk-, oder sonstwas) -Einzeiler in ein Skript zu schreiben, oder von der Shell aus zu benutzen ist noch einfacher, als jedes mal Vim zu laden oder gar, Gott behüte, ein Vim-Skript zu schreiben.

    Restrain the specimen!

  • Wo ich schon mal dabei bin:
    Wie kann ich einem Shell-Skript beibringen, jede Zeile eines config-Files als Environment-Variable zu exportieren, damit ich im conf-File kein "export" stehen habe (ausgenommen Kommentare, die mit '#' beginnen)?

    z.B. ein File z.conf
    VERSION=12
    PATH=/xy

    das Skript soll z.conf einlesen und daraus die Befehle
    "export VERSION=12"
    und
    "export PATH=/xy"
    generieren.

    Vermutlich müsste ich dazu nur wissen, wie ich zeilenweise lesen kann und wie ich einen substring-Vergleich machen kann (1. Zeichen). Wenn möglich nur mit Shell-Bordmitteln.

  • Wo ich schon mal dabei bin:
    Wie kann ich einem Shell-Skript beibringen, jede Zeile eines config-Files als Environment-Variable zu exportieren, damit ich im conf-File kein "export" stehen habe (ausgenommen Kommentare, die mit '#' beginnen)?

    z.B. ein File z.conf
    VERSION=12
    PATH=/xy

    das Skript soll z.conf einlesen und daraus die Befehle
    "export VERSION=12"
    und
    "export PATH=/xy"
    generieren.

    Vermutlich müsste ich dazu nur wissen, wie ich zeilenweise lesen kann und wie ich einen substring-Vergleich machen kann (1. Zeichen). Wenn möglich nur mit Shell-Bordmitteln.

  • mhh.. so auf die schnelle.. so ca. müsst das funktionieren denk ich:


    bes. beim sed-ausdruck bin ich mir aber nicht 100% sicher ;)

    Let us be thankful we have commerce. Buy more. Buy more now. Buy. And be happy.

  • Zitat

    Wie kann ich einem Shell-Skript beibringen, jede Zeile eines config-Files als Environment-Variable zu exportieren, damit ich im conf-File kein "export" stehen habe (ausgenommen Kommentare, die mit '#' beginnen)?


    Das geht auch viel einfacher:

    Code
    source filename


    Oder noch kürzer:

    Code
    . filename
  • Zitat von [fl]Quel`Tos

    mhh.. so auf die schnelle.. so ca. müsst das funktionieren denk ich:


    bes. beim sed-ausdruck bin ich mir aber nicht 100% sicher ;)


    hmm, woher kriegt "while read var" die Daten?
    Jensi: wäre schön, dabei werden die Variablen aber nicht exportiert.

    Ich krieg von den blöden Skriptsprachen Kopfschmerzen...

  • Zitat von Incazzato

    hmm, woher kriegt "while read var" die Daten?

    Code
    while read var
    do
      ...
    done [b]< z.conf.temp[/b]


    da her ;)

    könntest glaub ich auch so machen:

    Code
    cat z.conf.temp | while read var
    bla..

    Let us be thankful we have commerce. Buy more. Buy more now. Buy. And be happy.

  • Zitat von [fl]Quel`Tos
    Code
    while read var
    do
      ...
    done [b]< z.conf.temp[/b]


    da her ;)


    ach so... sowas hab ich noch nie gesehen.

    Zitat von Jensi

    Was willst du damit denn machen?


    Flexible, automatische Generierung eines make-Environments

  • Zitat von [fl]Quel`Tos
    Code
    while read var
    do
      ...
    done [B]< z.conf.temp[/B]

    da her ;)

    könntest glaub ich auch so machen:

    Code
    cat z.conf.temp | while read var
    bla..

    Ersteres liest zeilenweise, letzteres Whitespace-separiert. Kommt eben drauf an, was man braucht. :)

  • glaub ich eher nicht:

    Code
    $ cat testfile
    this will take a while
    Code
    $ while read foo bar
    > do
    > echo "$foo"
    > echo "$bar"
    > done < testfile
    this
    will take a while
    Code
    $ cat testfile | while read foo bar
    > do
    > echo $foo
    > echo $bar
    > done
    this
    will take a while


    tun beide genau das selbe - od. hab ich da wo an fehler?

    Let us be thankful we have commerce. Buy more. Buy more now. Buy. And be happy.

  • Zitat von [fl]Quel`Tos

    glaub ich eher nicht:

    Code
    d. hab ich da wo an fehler?[/quote] 
    Nope - ich hab nur den dummen Fehler begangen, dein Konstrukt auf die Schnelle mit sowas schaendlichem wie
    [code]for i in `cat file`; do ...; done;

    zu verwechseln ;)

  • Zitat von MaxAuthority

    Dann probier mal das: http://onion.dynserv.net/%7Etimo/tconf.html

    Bash-basiert, und find ich sehr nett zum verwenden.


    Die Freiheit hab ich leider nicht. Das betreffende Projekt ist sehr eng an ein vorhandenes SDK (embedded system) geknüpft, das eine ganz eigene Makefile-Struktur hat. Meine Skripte sollen nur ein paar Sachen automatisieren (benötigtes Environment erstellen, make-targets aufrufen, die Version des SDK berücksichtigen, ein config-Fike in Compilerflags "übersetzen"...)

    danke für eure Hilfe

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!