PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sed/awk suchen ersetzen duch dateiinhalt



EA80
14-01-2002, 12:34
hallo leute , ich habe ein kleines problem

ich möchte mit sed oder awk einen string(IP adr) in einer datei durch den inhalt einer zweiten datei ersetzen.

beispiel:
sed -e 's/222.222.222.222 /111.111.111.111 /g' dateiname

so wird in der datei die ip adr. 222.222.222.222 durch
111.111.111.111 ersetzt. ich möchte aber die ip adr aus einer
datei beziehen, die zb. ip_neu heisst und in der nur die neue
ip steht.

ich hab es mal mit quoten probiert

sed -e 's/222.222.222.222 /`cat ip_neu` /g' dateiname
aber das klappt mit sed nicht.

kann mir da jemand helfen ????

mightymike99
14-01-2002, 16:03
- Wenn du die Backticks absolut mit einfachen Hochkommata quotierst kann das nix werden. Deswegen Anführungszeichen nehmen

- Zweitens wuerde ich Backticks nicht verwenden da man die zu leicht mal verwechselt nimm' lieber $(...) das ist übersichtlicher und verschachtelbar!

also:


sed -e "s/222.222.222.222 /$(cat ip_neu)/g" dateiname

gruß
fork

Rebell
17-07-2002, 09:46
Ich hab folgendes versucht


sed --quiet -e "s/alter_key.crt/neuer_key.crt/ig" /etc/httpd/httpd.conf


hat aber keine Veränderung durchgeführt...

lankin
18-07-2002, 13:41
hai rebell,

wenn ich dein prob richtig deute, dann hängt es daran, das "sed" files nicht in sich selbst verändert !

du müsstest mit sed folgendes machen:
# sed "s/alter_key.crt/neuer_key.crt/g" /etc/httpd/httpd.conf > /etc/httpd/httpd.conf.neu
# mv /etc/httpd/httpd.conf.neu /etc/httpd/httpd.conf


oder interaktiv am file selbst mit einem kleine
"here-dokument" um einen editor wie vi/ex/ed:

# ex /etc/httpd/httpd.conf << EOF
> :s/alter_key.crt/neuer_key.crt/g
> w
> EOF

und schon ist die datei selbst verändert.
(OBACHT ! syntax-konvetionen beim here-document
sind sehr wichtig !)

gruss
lankin

Rebell
23-07-2002, 08:37
Ok danke. Und wie ändere ich gefilterte Dateien? Angenommen ich möchte einen Pfad aller HTML-Dateien in einem Verzeichnis ändern.

cat *.htm | sed -e "s/Bilder/neu\/bilder/g" > *.*

Also ich möchte dass sed die Ausgabedatei mit der Eingabedatei überschreibt...
(was so nicht möglich ist)

lankin
23-07-2002, 09:26
hi rebell,

du must die dateien nach dem verändern schon
umkopieren. das direkte überschreiben beim
(quasi) gleichzeitigen lesen könnte u.u. zu fatalen
folgen führen. davon kann ich nur abraten.

oder eben mit einem "here-document"
(siehe 2. beispiel in der letzen mail)
arbeiten. damit kannst du die files verändern
ohne dich selbst um tmp-files kümmern
zu müssen.


ciao
lankin

lankin
23-07-2002, 09:32
kleine ergänzung,

schon gefiltere dateien in einem separaten
verzeichnis mit gleichen namen könntest du
mit einer kleinen schleife überschreiben,
damit die namen eindeutig bleiben.

find . -name '*htm' |
while read FILE
do
sed -e "s/Bilder/neu\/bilder/g" $FILE > ziel/$FILE
done

ciao
lankin