bestimmte Strings in Dateien ersetzen mit der Bash
Kristin
- programmiertechnik
Hi!
ich möchte in einigen Dateien ein bestimmten String ersetzen.
ich will den String STRING1 in STRING2 in den Dateien ersetzen, wenn am Zeilenanfang "$password" oder "my $password" steht. STRING1 ist nicht bekannt.
datei1 -> my $password = "STRING1";
datei2 -> $password = "STRING1";
datei3 -> $password = "STRING1";
kleine Probleme habe ich schon beim grep
grep ^$password $i
wie kann ich da das optionale "my " am Anfang unterbringen?
ich habe es mir so gedacht, dass ich den String STRING1 ermittel und das dann an sed übergebe, damit sed den STRING1 durch STRING2 ersetzen kann.
bis jetzt habe ich folgenden Code geschrieben
for i in datei1 datei2 datei3;
do grep ^$password $i |cut -d '"' -f 2;
done;
womit ich STRING1 jeweils ermittel
wie kann/muss ich jetzt die Zeile
my $password = "STRING1";
in
my $password = "STRING2";
ersetzen?
Kristin
Hello Kristin,
aus der Datei source1.txt:
blah
$password = "xSTRiNG1";
blubb
$password = "Singsang09";
dödel
$password = "STRxNGlechen";
wutz
wird durch:
cat source1.txt | sed -n 's/= ".*";/= "neues_PW";/
die Ausgabe:
blah
$password = "neues_PW";
blubb
$password = "neues_PW";
dödel
$password = "neues_PW";
wutz
Die kannst Du dann entweder durch Umleitung wieder in eine Datei schieben, oder Du nimmst den Masterbefehl -i für die Ersetzung in der Quelldatei oder Du schreibst sie statt /p mit dem Befehl /w Dateiname weg.
Ich mag das direkte Ersetzen in der Datei und das Steiklle Wegschreiben nicht :-)
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hi,
do grep ^$password $i |cut -d '"' -f 2;
was steht hier in $i? Kann die entsprechende Zeile mehrmals in der Datei vorkommen oder nur einmal?
String1 müsstest Du so lesen können:
string1=grep -e "^(my)? '$passwort'" | cut -d\" -f2
Ich würde aber wohl generell eher folgendes machen:
Erstmal nach der kompletten korrekten Zeile suchen:
alteZeile=grep -e "^(my)? '$password' \*\".\*\"\;$"
Teil bis zum String abtrennen:
ersterTeil=`echo $alteZeile | cut -d" -f1
Und dann die neue Zeile zusammen basteln:
neueZeile=echo $ersterTeil"\""$string2"\""
Dann mit sed die komplette alte Zeile durch die neue ersetzen lassen:
sed -i 's/'$alteZeile'/'$neueZeile'/g' dateiname
Das ist jetzt nicht getestet! Kann also sein, dass nicht alles korrekt escaped ist und jedes Hochkommata richtig sitzt.
Ciao, Stefanie
Hello,
Ich würde aber wohl generell eher folgendes machen:
Erstmal nach der kompletten korrekten Zeile suchen:
Teil bis zum String abtrennen:
Und dann die neue Zeile zusammen basteln:
Dann mit sed die komplette alte Zeile durch die neue ersetzen lassen:
Hatte ich auch erst gedacht.
Aber wenn ich schon sed oder awk einsetze, brauch eich für diese einfache Ersetzung kein grep und kein cut mehr.
Meine gepostet Lösung ist zwar nicht vollständig für die reale Welt, man kann aber aus dem geposteten und getesteten Code erkennen, was noch fehlt.
Zur Zeit werden alle Zeilen, die eine Zuweisung mit = enthalten modifiziert. Will man das nicht, muss man nur die Suche etwas genauer definieren und die Ersetzung eben ergänzen.
Leider ist mir bisher verborgen geblieben, ob sed Back References oder hier vielmehr Forward References untersützt. Dann könnte man das auch noch universeller machen.
Achtung, hier würde direkt die Originalfatei 'source1.txt' verändert werden.
sed -i 's/assword *= *".*";/assword = "neues_PW";/' source1.txt
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hi,
Aber wenn ich schon sed oder awk einsetze, brauch eich für diese einfache Ersetzung kein grep und kein cut mehr.
Eigentlich hast Du recht. Leider versteht sed weit weniger reguläre Ausdrück egrep, ich bin bei dem Versuch schon öfter gescheitert... Außerdem gibt es zudem noch verschiedene Versionen und in mehreren Schritten kannst Du es leichter debuggen, wenn es eben doch nicht klappt.
Leider ist mir bisher verborgen geblieben, ob sed Back References oder hier vielmehr Forward References untersützt.
Back References meine ich schon. Habe ich aber auch noch nicht probiert.
Aber mir ist noch was eingefallen. Man könnte ja mit einem einzigen sed-Befehl zunächst die Zeilen addressieren, die den Suchstring password enthalten und dann in diesen Zeilen alles zwischen " und " durch den neuen String ersetzen. Also irgendwie so:
sed -i '/password/ s/".*"/"'$stringNeu'"/g' dateiname
Wie immer führen da 3643 Wege zum Ziel ;-)
Konnte Dir das nun eigentlich helfen, Kristin?
Ciao, Stefanie