staging.inyokaproject.org

sed - welche Zeichen müssen bei sed maskiert werden

Status: Gelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

humanoid1

Anmeldungsdatum:
15. März 2022

Beiträge: Zähle...

Danke das dieses Forum existiert. Bei folgendem String

1
sed -i 's/\// "${distro_id} ${distro_codename}-updates"/"${distro_id} ${distro_codename}-updates"' /etc/apt/apt.conf.d/50unattended-upgrades

erhalte ich immer eine Fehlermeldung

1
sed: -e Ausdruck #1, Zeichen 49: Unbekannte Option für »s«

Meine Vermutung, dass diese vielen Sonderzeichen jedes einzelne maskiert werden muss. Doch obwohl ich alle maskiert hatte mit dem Backslash "\", kamen wieder Fehlermeldungen. Daher poste ich meinen ursprünglichen String.

Ich hoffe, dass mein erstes post richtig ist und nicht viele Rüffel auslöst ☺

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

humanoid1 schrieb:

Danke das dieses Forum existiert.

Herzlich willkommen!

Bei folgendem String

1
sed -i 's/\// "${distro_id} ${distro_codename}-updates"/"${distro_id} ${distro_codename}-updates"' /etc/apt/apt.conf.d/50unattended-upgrades

erhalte ich immer eine Fehlermeldung

1
sed: -e Ausdruck #1, Zeichen 49: Unbekannte Option für »s«

Meine Vermutung, dass diese vielen Sonderzeichen jedes einzelne maskiert werden muss. Doch obwohl ich alle maskiert hatte mit dem Backslash "\", kamen wieder Fehlermeldungen. Daher poste ich meinen ursprünglichen String.

Nein, das Problem ist, dass Du einen Forward Slash nicht escaped hast und dann fehlt auch der schließende Forward Slash.

s/\// "${distro_id} ${distro_codename}-updates"/"${distro_id} ${distro_codename}-updates"

Das führt dazu, dass alles hinter dem markierten als Option betrachtet wird. Eine einfache Lösung ist, einen anderen Trenner zu nehmen, z.B. "#":

1
sed -i 's#/# "${distro_id} ${distro_codename}-updates"/"${distro_id} ${distro_codename}-updates"#' /etc/apt/apt.conf.d/50unattended-upgrades

Allerdings: damit das wirklich robust ist, musst Du entweder sicher stellen, dass in den Variablen der Trenner nicht vorkommt ODER Du musst den Inhalt der Variablen escapen.

Ich hoffe, dass mein erstes post richtig ist und nicht viele Rüffel auslöst ☺

Alles gut.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Wenn ich das richtig verstehe, willst du den Doppelslash vor der Zeile mit

//      "${distro_id}:${distro_codename}-updates";

entfernen. Die Fehlermeldung bekommst du, weil du den zweiten Slash nicht escapest - für sed kann man statt / auch andere Zeichen nutzen, um den Befehl von Suchmuster und der Ersetzung abzugrenzen - und durch die Verwendung von Gruppen kann man sich das Leben etwas leichter machen, weil man den Ersetzungsteil kürzer machen kann:

sed 's#//\(.\+\)\("${distro_id}:${distro_codename}-updates";\)#  \1\2#' /etc/apt/apt.conf.d/50unattended-upgrades 

humanoid1

(Themenstarter)

Anmeldungsdatum:
15. März 2022

Beiträge: Zähle...

Danke rklm, aber seahawk1986 hat es sehr gut erkannt, dass das 2. Zeichen der Auskommentierung nicht maskiert war.

@seahawk1986 - DANKE, noch eins, wie kann ich in deiner Lösung die anschließende less-Ansicht zur Kontrolle abschalten?

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

humanoid1 schrieb:

@seahawk1986 - DANKE, noch eins, wie kann ich in deiner Lösung die anschließende less-Ansicht zur Kontrolle abschalten?

sed -i verwenden

humanoid1

(Themenstarter)

Anmeldungsdatum:
15. März 2022

Beiträge: Zähle...

♥ Also, dass ist sehr beeindrucken wie schnell und kompetent hier reagiert wird.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

humanoid1 schrieb:

@seahawk1986 - DANKE, noch eins, wie kann ich in deiner Lösung die anschließende less-Ansicht zur Kontrolle abschalten?

Nur zum besseren Verständnis - sed ändert die Datei selbst nur, wenn du es mit -i aufrufst, sonst gibt es die Datei inkl. Änderungen auf stdout aus.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

humanoid1 schrieb:

Danke rklm, aber seahawk1986 hat es sehr gut erkannt, dass das 2. Zeichen der Auskommentierung nicht maskiert war.

Ja, aber der Slash im Pfad war auch nicht maskiert und der dritte Slash fehlte auch.

Antworten |