SED Hilfe

S

Screamer

Grünschnabel
Hallo,
ich habe ein Problem, und zwar habe ich vor aus einer Datei (proxy.txt) jeweils Zeile für Zeile eine IP auszulesen welche ich dann mittels SED in probe.cfg einsetze.
Mein Problem ist das in probe.cfg eine Zeile steht welche z.b. lautet: http_proxy:http://212.68.215.87:80/

Jetzt will ich mit sed alles nach "http_proxy:" mit der neuen IP ersetzen... und das fortlaufend mit einer for Schleife...
Meine aktuellster Versuch sieht so aus:

Code:
#!/bin/sh

for I in 'cat proxy.txt'
do
  sed 's/http_proxy.*$/'"$I"'/' probe.cfg
done

leider klappt dies aber nicht, da der sed befehl so wie er im code steht die gesamte zeile ersetzen würde, aber selbst das funktioniert nicht und ich glaube auch nicht das das so mit der Variablen funktioniert.......

Vielleicht kann mir da jemand helfen bin halt leider neu auf dem Gebiet....:hilfe2:


Grüßle
Screamer
 
Ganz banaler Ansatz:
Code:
#!/bin/sh
for I in `cat proxy.txt` ; do
  echo http_proxy:${I} > probe.cfg
done
 
hmm ich weiß eigentlich nicht wie das funktioniert....aber irgendwie scheint es erfolg zu haben.....
aber nun steht nach script ende immer http_proxy:cat proxy.txt
wieso ist das so??
und wenn ich schreibe:
Code:
#!/bin/sh

for I in 'cat proxy.txt'
do

  echo http_proxy:${I} > probe.cfg
  more probe.cfg
done

...gibt er mir nur einmal probe.cfg aus....obwohl er das doch viel öfters tun müsste....(solange wie IP adressen in proxy.txt stehen, oder??)

Vielen Dank schonmal im voraus....


Screamer
 
hmm ich weiß eigentlich nicht wie das funktioniert....aber irgendwie scheint es erfolg zu haben.....
aber nun steht nach script ende immer http_proxy:cat proxy.txt
wieso ist das so??
Von deinem Beispiel ausgehend, unterstelle ich einfach mal, daß du einfache Anführungszeichen (ticks) und 'backticks' verwechselt hast. Backticks sind auf der Tastatur die einfachen Anführungszeichen mit <shift>. Je nach Tastaturbelegung mußt du danach die Leertaste drücken um das Zeichen zu bekommen, also <shift>+<'>, <space>
Die Backticks schliessen ein Kommando ein und in der Ausgabe wird der Kommandostring durch die Ausgabe dieses Kommandos ersetzt.
und wenn ich schreibe:
Code:
#!/bin/sh
for I in 'cat proxy.txt'
do
  echo http_proxy:${I} > probe.cfg
  more probe.cfg
done
...gibt er mir nur einmal probe.cfg aus....obwohl er das doch viel öfters tun müsste....(solange wie IP adressen in proxy.txt stehen, oder??)
Siehe obiges Problem.

Allerdings ist mir vielleicht ein kleiner Fehler unterlaufen, je nachdem, was du in proxy.txt haben willst.
So wie das Kommando jetzt dasteht, wird die Datei bei jedem Schleifendurchlauf neu geschrieben. Die Zeilen werden also nicht angehängt!
Um die Zeilen jeweils an die Datei anzuhängen mußt du '>' durch '>>' ersetzen.

Gruß
XL
 
jo super dankeschön ich hab da leider noch net so durchblick wegen ticks and backticks:O
Eine Frage hab ich noch...und zwar wenn in der probe.cfg mehrere zeilen stehen und davon nur die zeile ersetzt werden soll welche mit http_proxy anfängt, funktioniert das doch nicht mit dem echo befehl nicht, weil dieser doch den rest der datei verwirft und nur die zeile einträgt, oder??

Grüßle

Screamer
 
Eine Frage hab ich noch...und zwar wenn in der probe.cfg mehrere zeilen stehen und davon nur die zeile ersetzt werden soll welche mit http_proxy anfängt, funktioniert das doch nicht mit dem echo befehl nicht, weil dieser doch den rest der datei verwirft und nur die zeile einträgt, oder??
Ich kenne den Aufbau dieser probe.cfg nicht. Die Variante mit 'echo' schreibt die komplette Datei neu.
Wenn du in dieser Datei nur eine Zeile aktualisieren möchtest, mußt du tatsächlich mit 'sed' oder ähnlichem arbeiten.

Code:
#!/bin/sh
for I in `cat proxy.txt` ; do
  sed s/http_proxy.*/http_proxy:${I}/ < probe_alt.cfg > probe_neu.cfg
done
Mußt mal nachschauen, wie 'sed' eine Datei direkt ändert, also ohne den Umweg über eine temporäre Datei. Ansonsten gilt auch hier: backticks um das Kommando im Schleifenkopf!

Gruß
XL
 
also ich komme dem ziel stückchen für stückchen näher...aber ich habe das gefühl das er die zeile nicht findet welche er ersetzen soll....

mein aktuellstes skript sieht so aus:

Code:
#!/bin/sh

for I in `cat proxy.txt`
do

  sed s/^http_proxy.*/http_proxy:${I}/ probe.cfg
  more probe.cfg
  sleep 5
done

und die ausgabe sieht so aus

Code:
http_proxy:125.214.234.233:80
http_proxy:192.17.239.250:68664
http_proxy:156.108.28.187:80
http_proxy:192.17.239.250:68664
http_proxy:159.213.87.22:80
http_proxy:192.17.239.250:68664

sprich er setzt die variable $I schon zusammen aber in probe.cfg wird es nie eingetragen....woran kann das liegen??

Grüßle

Screamer
 
Der Hintergrund, warum in probe.cfg nichts drinsteht ist, dass sed per default nichts innerhalb einer Datei ersetzt, sondern die Ersetzung nur auf Standard-Out ausgibt. Um dies zu erzwingen, musst Du entweder die Option -i angeben (bitte vorher Backup der Dateien machen!!) oder Du gehst über eine Tempdatei, so wie es mein Vorredner schon beschrieben hat...

Schau Dir doch mal bitte die Man-Page von sed an, speziell die Option -i falls es die überhaupt bei deinem Sed gibt.
Da Du Deine Sed Version hier nicht angegeben hast, kann auch keiner mit Sicherheit sagen, dass Dein Sed gewisse Optionen unterstützt.

Was Du Dir für die Zukunft merken solltest, wenn Du hier postest, dass Du neben Shell- und Kommandoversion (also z.B. von bash und sed) auch immer den genauen Inhalt oder zumindest ein Beispielt Deiner Eingabedatei angibst und dazu schreibst, wie es im nachhinein aussehen soll - das erleichtert ungemein.

Ferner benutzt Du einen sleep in Deinem Konstrukt, sleeps in einem Programm sind in den allerwenigsten Fällen nötig, als weg damit!

Das more-Kommando kannst Du Dir ebenfalls sparen -> ebenfalls raus damit.

Was mir noch einfällt: Statt einer for-Schleife könntest Du auch eine while-Schleife benutzen:
Code:
while read line; do echo $line; done < Eingabedatei.txt
 
Zuletzt bearbeitet:
vielen dank an euch zwei....hat nun endgültig geklappt der letzte fehler lag noch an dem -i......also vielen dank nochmal:)


Screamer
 

Ähnliche Themen

Zeilen kopieren mit SED

SED: Zu bearbeitende Dateien aus Textfile einlesen

Zeilen löschen und ersetzen mit sed

Shell Script zur Stapelverarbeitung von Bildern

bash: Fehlermeldung und Werte in Array sortieren?

Zurück
Oben