staging.inyokaproject.org

Variable in sed einfügem

Status: Ungelöst | Ubuntu-Version: Ubuntu Budgie 18.10 (Cosmic Cuttlefish)
Antworten |

Juljano

Anmeldungsdatum:
24. Juni 2017

Beiträge: Zähle...

Sehr geehrte Damen und Herren,

wie kann ich am besten eine Variable in eine Sed-Kommando ein bauen?

Das ist meine variable :

Windvar=$(cat Windgeschwindigkeit3.txt)

Windgeschwindigkeit.txt beinhaltet nur eine Zahl.

Mit sed wollte ich das Wort 'HIER' durch die Variable ersetzen:

sed -i "/Hier/$Windvar/g" *.html

Nur funktioniert es nicht kann mir einer erklären weshalb?

Mit freundlichen Grüßen ,

Kelly aus Australien (Entschuldigung für mein schlechtes Deutsch ☹);

tomtomtom Team-Icon

Supporter
Avatar von tomtomtom

Anmeldungsdatum:
22. August 2008

Beiträge: 55572

Juljano schrieb:

Mit sed wollte ich das Wort 'HIER' durch die Variable ersetzen:

sed -i "/Hier/$Windvar/g" *.html

Nur funktioniert es nicht kann mir einer erklären weshalb?

Zuerst einmal ist die sed-Syntax falsch.

sed -i s/ALTER_WERT/NEUER_WERT/g DATEI 

Zum anderen ist sed ein Editor und sieht $Windvar nicht als Variable, sondern als Text.

Kelly aus Australien (Entschuldigung für mein schlechtes Deutsch ☹);

Mal abgesehen davon, dass ich da kein schlechtes Deutsch feststellen kann: Es soll ja gerüchteweise auch englischsprachige Ubuntu-Foren geben. 😈

Juljano

(Themenstarter)

Anmeldungsdatum:
24. Juni 2017

Beiträge: 17

Gibt es alternativen?

Ich benutze dieses Forum weil ich somit mehr Deutsch lernen kann.

Mit freundlichen Grüßen ,

Kelly

Seebär

Avatar von Seebär

Anmeldungsdatum:
2. Mai 2009

Beiträge: 833

Size matters. Also HIER statt Hier im sed angebrn. Ob das globbing mit *html so passt weiss ich nicht. Was bedeutet denn "funktioniert nicht"?

Habe im Übrigen schon Australier getroffe die schlechter deutsch konnten ...

Seebär

Avatar von Seebär

Anmeldungsdatum:
2. Mai 2009

Beiträge: 833

In shell-Scripten mit sed-Aufruf lassen sich sehr wohl Variablen nutzen, da liegt 3xtom falsch.

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Es ist noch wichtig, dass die Datei keine Zeilenumbrueche zu viel enthaelt. zB mal mit echo [Befehl] pruefen, dass eh das richtige Ergebnis ausgefuehrt wird.

tomtomtom Team-Icon

Supporter
Avatar von tomtomtom

Anmeldungsdatum:
22. August 2008

Beiträge: 55572

Seebär schrieb:

In shell-Scripten mit sed-Aufruf lassen sich sehr wohl Variablen nutzen, da liegt 3xtom falsch.

ARG, da hat der Seebär recht.

Juljano

(Themenstarter)

Anmeldungsdatum:
24. Juni 2017

Beiträge: 17

Hallo ,

ich wollte das sed mir in ein HTML-Dokument das Wort 'Hier' durch -4.41 °C ersetzt (Der Inhalt der Variable, auch ändert sich der Wert der Variable).

Seebaer kannst du mir ein Beispiel zeigen?

Wenn ich das Kommando von sed ausführen ersetzt es 'Hier' nicht durch -4.41 sondern schreibt nur den Variablenamen.

sed -i "/Hier/$Windvar/g" *.html

MfG, Juljano

Juljano

(Themenstarter)

Anmeldungsdatum:
24. Juni 2017

Beiträge: 17

Kann mir keiner helfen?☹

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

Die Variable gehört in Anführungszeichen.

1
2
3
4
5
6
7
root@localhost:~# echo "das ist text" > datei
root@localhost:~# cat datei
das ist text
root@localhost:~# windvar="33"
root@localhost:~# sed -i "s#text#"$windvar"#g" datei
root@localhost:~# cat datei
das ist 33

Juljano

(Themenstarter)

Anmeldungsdatum:
24. Juni 2017

Beiträge: 17

Hallo,

Windvar=$(cat Windgeschwindigkeit3.txt) = 6.1 km/h

sed -i "s#Hier#"$Windvar"#g" index.html

Dann bekomme ich eine Fehlermeldung :

sed: -e Ausdruck #1, Zeichen 7: Nicht beendeter »s«-Befehl

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

Juljano schrieb:

Windvar=$(cat Windgeschwindigkeit3.txt) Windgeschwindigkeit.txt beinhaltet nur eine Zahl.

Juljano schrieb:

Windvar=$(cat Windgeschwindigkeit3.txt) = 6.1 km/h

Erst ist es nur eine Zahl, dann aber doch nicht. Bitte entscheide Dich ☺

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
root@localhost:~# echo "es ist HIER windig">datei
root@localhost:~# cat datei 
es ist HIER windig
root@localhost:~# 
root@localhost:~# windvar="6.1 km/h"
root@localhost:~# suchtext="HIER"
root@localhost:~# 
root@localhost:~# sed -i "s#"$suchtext"#""$windvar""#g" datei
root@localhost:~# cat datei
es ist 6.1 km/h windig

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Ich bekomme da schon früher einen Fehler:

1
2
3
Windvar=$(cat Windgeschwindigkeit3.txt) = 6.1 km/h
cat: Windgeschwindigkeit3.txt: Datei oder Verzeichnis nicht gefunden
=: Befehl nicht gefunden.

Oder soll das hintere nur ein Kommentar sein, der besagen will, dass 6.1 km/h das erwartete Ergebnis ist? Das würde man mit einem Kommentar darstellen. Kommentare gehen vom Hash bis zum Zeilenende:

Windvar=$(cat Windgeschwindigkeit3.txt) # = 6.1 km/h

Wenn die Variable ein Leerzeichen (oder mehrere, oder Tabs, oder Zeilenumbrüche) enthält, wird die Sache komplizierter und Fehleranfälliger. Also besser vermeiden, und km/h in die Vorlage packen, außer Du brauchst zwischendurch auch m/s oder mph.

1
2
3
echo "es ist HIER km/h windig" > winddatei
windvar="6.1"
sed -i "s/HIER/$windvar/g" winddatei

Einmal doppelte Anführungszeichen ist bei Sed keine schlechte Idee, weil man oft Zeichen vor der Interpretation durch die Shell schützen muss. Der Standardtrenner ist "/" - den würde ich nicht durch "#" ersetzen, weil das schnell als Kommentar erkannt wird, wenn Du mit dem Maskieren durcheinander kommst.

Den Suchtext indirekt zu adressieren, da sehe ich keinen Vorteil drin. Unnötige Komplexität ist eine Fehlerquelle.

1
sed -i "s#"$suchtext"#""$windvar""#g" datei

Wenn man sich Mühe gibt schafft man sicher auch 6 Anfürhungsstriche hintereinander zu setzen. Nur: Wozu?

Wenn man das -i weglässt, dann kann man leicht testen ob es klappt, weil das Ergebnis auf den Bildschirm geschrieben wird. Am Ende natürlich mit -i, um die Datei zu ändern.

Das Beispiel hier funktioniert auch ganz ohne Anführungsstrich:

1
2
sed s/HIER/$windvar/g winddatei
es ist 6.1 km/h windig

Sed braucht die nicht. Aber wenn im Text ein Semikolon ist, (in HIER oder $windvar) dann kracht es schon.

Antworten |