hausens
Goto Top

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.
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

Content-ID: 212514

Url: https://administrator.de/contentid/212514

Ausgedruckt am: 22.11.2024 um 08:11 Uhr

Lochkartenstanzer
Lochkartenstanzer 26.07.2013 um 09:10:24 Uhr
Goto Top
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:

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.
Lochkartenstanzer
Lochkartenstanzer 26.07.2013 aktualisiert um 09:12:10 Uhr
Goto Top
Nachtrag:

Und die Anzahl der Quotes ist auch "unmatched". Zähl mal durch. face-smile

lks
hausens
hausens 26.07.2013, aktualisiert am 02.08.2013 um 07:09:11 Uhr
Goto Top
Vielen dank für die schnelle Andwort.
Ich bin nicht so betagt mit shell scripts.. sollte ich mal ändern

das was ich oben Falsch geschrieben habe kommt dh das ich es per hand nochmals eingegeben habemir ist klar das ich 2x " brauche
Ich hab das nun mit der Variable versucht und es geht noch immer nicht...

hostname=test
sed -e "s/'$hostname'//g" hosts.txt  

Ausgabe hosts.txt:
test-srv
test

was mach ich noch Falsch?

fg

Hausens
hausens
hausens 26.07.2013, aktualisiert am 02.08.2013 um 07:10:09 Uhr
Goto Top
Ach und weiters sollte das Script nur nach GENAU der Zeichenkette suchen. dachte da an soetwas:

sed -e "s/'^$hostname$'/''/g" hosts.txt   

kommt das hin? was sagt ihr?
jodalein
jodalein 26.07.2013, aktualisiert am 29.07.2013 um 16:16:03 Uhr
Goto Top
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
Lochkartenstanzer
Lochkartenstanzer 26.07.2013 um 13:10:48 Uhr
Goto Top
Zitat von @hausens:
sed -e "s/'$hostname'//g" hosts.txt
was mach ich noch Falsch?

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
hausens
hausens 29.07.2013, aktualisiert am 02.08.2013 um 07:10:30 Uhr
Goto Top
Morgen,

nein es geht nicht um die /etc/hosts Datei.
es soll nur der Text bzw die ganze Zeile gelöscht werden. Hab aber nun die lösung gefunden:

sed -i "s/^$hostname$//g" hosts.txt   

aber die grep -v Version gefällt mir um einiges besser, danke für den Tipp face-smile


fg

Hausens
Lochkartenstanzer
Lochkartenstanzer 29.07.2013 um 09:54:49 Uhr
Goto Top
Zitat von @hausens:
aber die grep -v Version gefällt mir um einiges besser, danke für den Tipp face-smile

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
Lochkartenstanzer
Lochkartenstanzer 29.07.2013 aktualisiert um 09:58:44 Uhr
Goto Top
Hallo hausens,

wie ich fürher schon geschrieben hatte, könntest Du noch den Beitrag editieren, daß die Code-Tags in spitzen Klammern sind und auch Deine Kommentare mit Code in code-Tags einklammern und dadurch besser lesbar werden. Erleichtert anderen das Lesen des Beitrags.

lks