sed und bash

ghostadmin

Grand Admiral Special
Mitglied seit
11.11.2001
Beiträge
25.210
Renomée
190
Standort
Dahoam Studios
Ich möchte in einem Config File (rsnapshot) eine bestimmte Zeile ersetzen d.h. die Option snapshot_root neu setzen. Das raussuchen des Wertes ist kein Problem aber beim ersetzen mit sed funktioniert noch nichts. zwischen snapshot_root und Wert ist ausserdem noch ein TAB. Habe auch schon mit \t und \x9, \x09 getestet sowie mit single und double quotes.

Code:
snaprootold=$(cat "$config" | grep ^snapshot_root | awk '{ print $2 }')
sed -i "s/snapshot_root\\x9$snaprootold/snapshot_root\\x9$snaproot/g" "$config"
 
Useless use of cat. Probier's mal so:
Code:
snaprootold=$(grep "^snapshot_root" "$config" | awk '{ print $2 }')
sed -i "s#snapshot_root\t$snaprootold#snapshot_root\t$snaproot#g" "$config"
Wobei ich hoffe, dass du nur ersetzt, wenn es nötig ist. So wie die beiden Zeilen da stehen, wird immer ersetzt (und vorher sogar noch der Wert von snap_root ermittelt, was bei einer immer erfolgenden Ersetzung gar nicht nötig wäre).

Ergänzung:
Ach, ich seh grad, du hast \t bereits probiert. Dann solltest du dir mal genau anschauen, welches Zeichen da wirklich steht. Dafür bieten sich Kommandos wie z.B. xxd an.

MfG Dalai
 
omg das geht, es lag nur an den # (wieso # statt / ? vermutlich wegen den ")

Wenn ich das mache, kommt es wohl aufs selbe:
Code:
sed -i "s#^snapshot_root\x9.\+#snapshot_root\x9$snaproot#g" "$config"
 
Zuletzt bearbeitet:
(wieso # statt / ? vermutlich wegen den ")
Ich benutze immer #, wenn abzusehen ist, dass die Slashes unübersichtlich werden oder Slashes im Inhalt sind, die maskiert werden müssten (was dann unübersichtlich ist). Welches Zeichen man direkt nach dem s verwendet, ist egal, solange man das durchzieht. Normalerweise müsste bei dir auch der Slash funktionieren, aber ich kann mir vorstellen, dass in deiner/n Variable/n ebenfalls Slashes enthalten sind und sed die vielleicht als Marker sieht, um den nächsten Abschnitt von s einzuleiten.

MfG Dalai
 
Keine Ahnung, musst du wohl ausprobieren. Ich hab noch nie diese Hex-Syntax benutzt. Mit Sicherheit funktioniert \t1 ;).

MfG Dalai
 
Manchmal wäre es auch ganz nützlich einfach zu sagen WAS man erreichen will bevor man andere nachdem WIE für einen speziellen Lösungsweg fragt. Außer es gibt wesentliche Gründe warum man sich für einen Lösungsweg entschieden hat.
Rsnapshot kommt mit einer ganzen reihe von bewerten Skripts einmal einen Blick in
Code:
/usr/share/doc/rsnapshot/examples/utils
werfen.
Da aber nicht genau klar ist was erledigt werden soll kann man hier nur darauf verweisen, dass es dort wirklich nützliche Helferlein gibt.
Übrigens die gloreiche Variablen belegung für 'snapshotrootold' konnte man auch dem Skript rsnapshot_invert.sh entnehmen:
Code:
SNAPSHOT_ROOT=`grep ^snapshot_root $1|awk '{print \$2}'`

Wenn man etwas offener denkt kann man mit 'sed' auch ganze Zeilen ersetzen ( mit dem Kommando 'c' ). Das ist insbesondere bei validen Konfigurationsdateien (der Ausdruck '^snapshot_root' bedeutet schließlich etwas worauf sich auch ein Programm und Skripte verlassen) von Vorteil. Also verwendet man einfach 'grep -n' und erhält die Zeile wo das auftritt und ersetzt einfach die ganze zeile.

Code:
sed -i ''`grep -n -e "^snapshot_root"  /etc/rsnapshot.conf | cut -f1 -d:`' c snapshot_root what_ever_shit_i_want' /etc/rsnapshot.conf


---------- Beitrag hinzugefügt um 21:56 ---------- Vorheriger Beitrag um 21:47 ----------

Noch effizienter geht es sogar so:
2. Beispiel
Code:
sed -i '/^snapshot_root/c snapshot_root /whereis/my/dir/' /etc/rsnapshot.conf
 
Zurück
Oben Unten