Linux sh scripts - SED
Hallo,
Ich möchte per SED den Text einer Datei löschen. wenn ich dies auf der cli mache funktioniert es.
Da ich das ganze aber automatisieren möchte, wird die eingabe die gemacht wird in eine Variable gespeichert. Dann soll die Variable (sprich das was in der var deffiniert wurde) aus dem .txt File gelöscht werden.
Nur funktioniert das nicht.
Wenn man es im "Klartext" löschen möchte funktioniert es. So tut sich nichts.
Ich verwende einen Ubuntu 13.04 Server
fg
Hausens
Ich möchte per SED den Text einer Datei löschen. wenn ich dies auf der cli mache funktioniert es.
sed -e 's\test\\g' hosts.txt
Da ich das ganze aber automatisieren möchte, wird die eingabe die gemacht wird in eine Variable gespeichert. Dann soll die Variable (sprich das was in der var deffiniert wurde) aus dem .txt File gelöscht werden.
Nur funktioniert das nicht.
hostname=test
sed -e "s\'$hostname'\''\g" hosts.txt;
Wenn man es im "Klartext" löschen möchte funktioniert es. So tut sich nichts.
Ich verwende einen Ubuntu 13.04 Server
fg
Hausens
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 212514
Url: https://administrator.de/contentid/212514
Ausgedruckt am: 22.11.2024 um 08:11 Uhr
9 Kommentare
Neuester Kommentar
Moin,
Waum nimmst Du \ statt / oder :. \ hat Sonderbedeutungen und man muß mit der Anzahl der "Escapes" imerm gut aufpassen, welche Schicht zum Schluß die \ bekommen soll.
Außerdem nimmst Du in einem Fall double-quoteds und im anderen Fall single-quotes zum Einklammern des Ausdrucks. Auch hier hat das single-quote eine andere bedeutung als das double-quote! und in verbindung mit dem bakslash gibt das dann ganz andere Effekte,
Richtig sollte da also z.B. stehen:
und
Gruß
lks
PS: Setz die Code-Tags in spitze Klammern, dann funktioniert das auch.
Waum nimmst Du \ statt / oder :. \ hat Sonderbedeutungen und man muß mit der Anzahl der "Escapes" imerm gut aufpassen, welche Schicht zum Schluß die \ bekommen soll.
Außerdem nimmst Du in einem Fall double-quoteds und im anderen Fall single-quotes zum Einklammern des Ausdrucks. Auch hier hat das single-quote eine andere bedeutung als das double-quote! und in verbindung mit dem bakslash gibt das dann ganz andere Effekte,
Richtig sollte da also z.B. stehen:
sed -e "s/test//g"
und
sed -e "s/'$hostname'//g" hosts.txt
Gruß
lks
PS: Setz die Code-Tags in spitze Klammern, dann funktioniert das auch.
Hi,
1. du brauchst nicht um bedingt Quotes es reicht wenn alles richtig escaped ist.
2. willst du den eigenen Rechnernamen aus der Datei entfernen?
wenn ja nimm $HOSTNAME = localhost.domain.de (wenn es ein Domain Rechner ist)
3. du musst ein Leerzeichen mit \ escpaen
sed -s /XYZ/\ /g datei
Das geht so nicht:
sed -e "s/'^$hostname$'/''/g" hosts.txt
Das geht:
variable=pc1
sed -i s/$variable/\ /g hosts.txt = entfernt nur den Namen, aber falls dort noch IPs stehen bleiben die erhalten, eher schlecht
Ich vermute jetzt einfach mal es geht um die normale /etc/hosts
dann würde ich es mir einfacher machen um direkt die ganze Zeile zu löschen:
cat hosts.txt |grep -v $variable > tmp.datei && mv tmp.datei hosts.txt
wenn es mehrere Einträge sind die gelöscht werden sollen ist sed und eine schleife die bessere Option.
jodalein
1. du brauchst nicht um bedingt Quotes es reicht wenn alles richtig escaped ist.
2. willst du den eigenen Rechnernamen aus der Datei entfernen?
wenn ja nimm $HOSTNAME = localhost.domain.de (wenn es ein Domain Rechner ist)
3. du musst ein Leerzeichen mit \ escpaen
sed -s /XYZ/\ /g datei
Das geht so nicht:
sed -e "s/'^$hostname$'/''/g" hosts.txt
Das geht:
variable=pc1
sed -i s/$variable/\ /g hosts.txt = entfernt nur den Namen, aber falls dort noch IPs stehen bleiben die erhalten, eher schlecht
Ich vermute jetzt einfach mal es geht um die normale /etc/hosts
dann würde ich es mir einfacher machen um direkt die ganze Zeile zu löschen:
cat hosts.txt |grep -v $variable > tmp.datei && mv tmp.datei hosts.txt
wenn es mehrere Einträge sind die gelöscht werden sollen ist sed und eine schleife die bessere Option.
jodalein
Die Single-Quotes. weglassen. Die sorgen dafür, daß Du nicht den Variableninhalt von hostname, sondern den String "$hostname" suchst. Sorry, habe übersehen, daß Du den Inhalt der Variable meintest und nicht die Variable selbst.
lks
Sofern Du die Zeile ganz löschen willst, ist grep das Mittel der Wahl. Sollte aber nur der Zeileninhalt gelöscht werden und die Zeile als Leerzeile erhalten bleiben, ist sed das Bessere.
lks