Anzeige:
Ergebnis 1 bis 3 von 3

Thema: werte aus arrays in dateien ersetzen (sed)

  1. #1
    Registrierter Benutzer
    Registriert seit
    30.05.2004
    Beiträge
    8

    werte aus arrays in dateien ersetzen (sed)

    Hallo,

    ich habe 2 arrays, wobei das erste (A1) Zahlen und das zweite (A2) Dateipfade enthält.

    Die Zahlen aus A1 werden geordnet, durch Zeilenumbrüche getrennt in eine Datei gegeben und nun soll jeweils
    Code:
    ${A1[$i]}
    durch
    Code:
    ${A2[$i]}
    ersetzt werden.
    Mein bisheriger Versuch sieht aus wie folgt:
    Code:
    for ((i=0; i<${#A1[*]}; i++))
      do
        sed -e `s/${A1[$i]}/${A2[$i]}/` “datei_mit_sortiertem_${A1[$i]}” > “datei.tmp”
    done
    Dieser endet mit folgender Fehlermeldung:
    Code:
    ./script.sh: line 49: s/06//pfad/zu/der/datei/ebenfalls mit leerzeichen/: Datei oder Verzeichnis nicht gefunden
    sed: -e Ausdruck #1, Zeichen 1: unknown command: `ebenfalls'
    Und das für jedes ${A1[*]}.

    Anscheinend muss nur speziell escaped werden, doch habe ich keine Ahnung, wie.

    Ebenfalls ist mir aufgefallen, dass wenn ich anstatt ${A2[$i]} etwas konkretes wie “hallo” einsetze, nur ein Element verändert wird (immer dasselbe).

    Schonmal danke.
    MfG
    anzarr

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Die Backticks die du verwendest haben eigentlich zur Folge dass Code dazwischen wie ein Programmaufruf ausgeführt wird. Statt ` kannst du ' oder " nehmen.
    Zwischen ' werden Variablen nicht interpretiert. Also ":

    Code:
    for ((i=0; i<${#A1[*]}; i++))
      do
        sed -e "s/${A1[$i]}/${A2[$i]}/" "datei_mit_sortiertem_${A1[$i]}" > "datei.tmp"
    done
    Eventuell musst du auch noch/hilft es auch noch, den IFS auf einen Zeilenumbruch zu setzen (vor deinem Codestück):
    Code:
    IFS="
    "
    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    30.05.2004
    Beiträge
    8

    Lösung

    So,
    natürlich alles einfacher, als man es denkt und vorsachnell gehandelt.
    Ändern von
    Code:
    sed -e `s/${A1[$i]}/${A2[$i]}/`
    in
    Code:
    sed -e "s#${A1[$i]}#${A2[$i]}#"
    hat geholfen, Wusste nur erst nicht,dass man auch # und | als Trenner verwenden kann.

    Das andere Problem ergab sich auch nur aus eigener Unzulänlichkeit.
    sed holt ja bei jedem Druchgang die alte unveränderte Datei hervor und überschreibt die neu komplett wieder mit verändertem und unverändertem.
    Ein einfügen von
    Code:
    mv "datei.tmp" "datei_mit_sortiertem_${A1[$i]}"
    löst das Problem, die Änderungen der vorherigen Durchläufe der for-Schleife bleiben erhalten.

    Vielleicht hilfts jemandem....

    EDIT: das IFS- Konstrukt ist drin, habs nur vergessen zu schreiben

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •