[Gelöst] Frage zu Syntax von find/sed

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
desputin
Beiträge: 1297
Registriert: 24.04.2015 17:16:34

[Gelöst] Frage zu Syntax von find/sed

Beitrag von desputin » 16.12.2021 20:29:13

Hallo Ihr,
ich versuche, eine Grafik in vielen html-Dateien zu ersetzen. Es klappt aber noch nicht. Was mache ich falsch?

Also ich möchte den gesamten html-Code ersetzen, also den:

Code: Alles auswählen

<a href="https://friendi.ca/" target="_blank"><img src="images/Banner-Friendica.png" border="0" alt="" /></a>
mit diesem

Code: Alles auswählen

<a href="https://friendica2.ca/" target="_blank"><img src="images/Banner-Friendica2.png" border="0" alt="" /></a>
ersetzen.

Das hier ist mein Befehl, der nicht geht:

Code: Alles auswählen

find ~/websites/abc.de/  -name \*.html -exec sed -i "s/ "<a href="https://friendi.ca/" target="_blank"><img src="images/Banner-Friendica.png" border="0" alt="" /></a>" (/ "<a href="https://friendica2.ca/" target="_blank"><img src="images/Banner-Friendica2.png" border="0" alt="" /></a>" (/g" {} \;
Irgendwas stimmt aber nicht mit der Syntax. Wißt Ihr, wie es geht?
Viele Grüße desputin
Zuletzt geändert von desputin am 21.12.2021 21:11:58, insgesamt 1-mal geändert.
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

tobo
Beiträge: 1993
Registriert: 10.12.2008 10:51:41

Re: Frage zu Syntax von find/sed

Beitrag von tobo » 16.12.2021 20:53:20

Zunächst mal solltest du das Sed-Script in einfache Hochkomma einschließen (nicht in doppelte), da diese ja direkt (beim nächsten Vorkommen) wieder aufgehoben werden. Dann solltest du als Sustitute(-Syntax)-Trenner nicht den Slash verwenden, da dieser in deinem Fall nicht eindeutig ist, weil er auch im Such- und Ersetzungstext vorkommt. Also sowas dann erstmal:

Code: Alles auswählen

find ~/websites/abc.de/  -name \*.html -exec sed -i 's# "<a href="https://friendi.ca/" target="_blank"><img src="images/Banner-Friendica.png" border="0" alt="" /></a>" (# "<a href="https://friendica2.ca/" target="_blank"><img src="images/Banner-Friendica2.png" border="0" alt="" /></a>" (#g' {} \;
Jetzt musst du nur noch die überflüssigen " wegmachen...

Benutzeravatar
hikaru
Moderator
Beiträge: 13593
Registriert: 09.04.2008 12:48:59

Re: Frage zu Syntax von find/sed

Beitrag von hikaru » 16.12.2021 21:02:55

Ich sehe vier Probleme:
1. Du quotest dein sed-Script mit doppelten Anführungszeichen (»"«), hast diese aber auch im Pattern. Entweder nutzt du einfache Anführungszeichen (»'«) um dein sed-Script zu quoten, oder du musst die doppelten Anführungszeichen im Pattern escapen.

2. Nochmal fast das Gleiche: Du benutzt Slashes (»/«) als sed-Delimiter. Diese tauchen aber auch in deinem Pattern auf. Entweder musst du sie im Pattern escapen, oder du nutzt andere sed-Delimiter.

3. Selbst wenn du 1. und 2. erledigt hast, passt die Regex deines sed-Scripts nicht zum geposteten String. Ich bin zu faul, das sauber zu zerlegen, aber auf Anhieb sehe ich überzählige Leerzeichen und Klammern.

4. Das ist eher ein "Meta-Problem": Dein sed-Script ist visuell viel zu komplex um es zu durchschauen. Eigentlich willst du nur zwei Sub-Strings in der Zeile ersetzen, nicht die ganze Zeile an sich. Dann mach auch nur das:

Code: Alles auswählen

sed 's/friendi\.ca/friendica2.ca/;s/Friendica\.png/Friendica2.png/'
Edit:
Das könnte man der Übersichtlichkeit halber auch in zwei sed-Scripts auftrennen.

tobo
Beiträge: 1993
Registriert: 10.12.2008 10:51:41

Re: Frage zu Syntax von find/sed

Beitrag von tobo » 16.12.2021 21:20:30

hikaru hat geschrieben: ↑ zum Beitrag ↑
16.12.2021 21:02:55
Eigentlich willst du nur zwei Sub-Strings in der Zeile ersetzen, nicht die ganze Zeile an sich. Dann mach auch nur das:

Code: Alles auswählen

sed 's/friendi\.ca/friendica2.ca/;s/Friendica\.png/Friendica2.png/'
Das ist aber nicht dasselbe wie oben, weil deine Ersetzung jetzt kontextlos ist.

Benutzeravatar
hikaru
Moderator
Beiträge: 13593
Registriert: 09.04.2008 12:48:59

Re: Frage zu Syntax von find/sed

Beitrag von hikaru » 16.12.2021 21:34:41

Stimmt! Wir kennen den (notwendigen) Kontext natürlich nicht. Aber vielleicht lässt er sich vereinfachen.

Benutzeravatar
desputin
Beiträge: 1297
Registriert: 24.04.2015 17:16:34

Re: Frage zu Syntax von find/sed

Beitrag von desputin » 16.12.2021 21:56:27

Hallo Ihr, stimmt, vermutlich ist es einfacher, nur einzelne Dinge zu ersetzen. Mein Beispiel war allerdings noch etwas fehlerhaft.

Ich möchte das hier ersetzen

Code: Alles auswählen

https://friendi.ca/
durch das

Code: Alles auswählen

https://abc.de/buch-neu/
Und das hier:

Code: Alles auswählen

Banner-Friendica.png
Durch das:

Code: Alles auswählen

Banner_Horomonelle-Verhuetung-neu.png
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Benutzeravatar
desputin
Beiträge: 1297
Registriert: 24.04.2015 17:16:34

Gelöst

Beitrag von desputin » 21.12.2021 21:10:56

Code: Alles auswählen

find ~/websites/abc.de/  -name "*.html" -exec sed -i "s|altedomain.de/123|neuedomain.de/123|" {} +
und

Code: Alles auswählen

find ~/websites/abc.de/  -name "*.html" -exec sed -i s/banner-alt.png/Banner-neu.png/g {} +
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Benutzeravatar
hikaru
Moderator
Beiträge: 13593
Registriert: 09.04.2008 12:48:59

Re: [Gelöst] Frage zu Syntax von find/sed

Beitrag von hikaru » 21.12.2021 21:16:23

Du kannst auch mehrere Ersetzungen in einem sed-Script machen. Dann brauchst du nur einmal mit find durch deine Dateien schlappen.

Benutzeravatar
desputin
Beiträge: 1297
Registriert: 24.04.2015 17:16:34

Re: [Gelöst] Frage zu Syntax von find/sed

Beitrag von desputin » 22.12.2021 13:59:56

Ok, danke. Und wie grenze ich die einzelnen Dinge für sed dann voneinander ab im script?
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

tobo
Beiträge: 1993
Registriert: 10.12.2008 10:51:41

Re: [Gelöst] Frage zu Syntax von find/sed

Beitrag von tobo » 23.12.2021 15:41:06

Wie auch schon in hikarus erstem Beitrag zu sehen mit einem Strichpunkt. Das bedeutet dann, dass die 2. Substitution mit dem Ergebnis der ersten Substitution weiterarbeitet:

Code: Alles auswählen

$ echo A | sed 's/A/B/; s/B/C/'
C

Antworten