PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : werte aus arrays in dateien ersetzen (sed)



anzarr
13-09-2004, 16:31
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


${A1[$i]}

durch


${A2[$i]}

ersetzt werden.
Mein bisheriger Versuch sieht aus wie folgt:


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:


./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

peschmae
13-09-2004, 20:46
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 ":



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):


IFS="
"


MfG Peschmä

anzarr
14-09-2004, 13:16
So,
natürlich alles einfacher, als man es denkt und vorsachnell gehandelt.
Ändern von


sed -e `s/${A1[$i]}/${A2[$i]}/`

in


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


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