[gelöst] Stylesheet-Verweise hinzufügen, mit sed?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

[gelöst] Stylesheet-Verweise hinzufügen, mit sed?

Beitrag von paedubucher » 05.05.2014 16:08:31

Ich habe eine Reihe von HTML-Dateien, die jeweils auf zwei Stylesheets verweisen:

Code: Alles auswählen

<link rel="stylesheet" type="text/css" href="style/doc.css" media="all" />
<link rel="stylesheet" type="text/css" href="style/doc_screen.css" media="screen" />
Nun möchte ich zusätzlich, unterhalb der bisherigen Definitionen, in jeder Datei noch auf ein drittes Stylesheet verweisen, und zwar auf einen Print-Style:

Code: Alles auswählen

<link rel="stylesheet" type="text/css" href="style/doc_print.css" media="print" />
Ich muss also jeweils die Zeile mit "print_screen.css" suchen und unter der Ersetzung von "screen" durch "print" duplizieren. Mit sed -i sollte das ja theoretisch möglich sein:

Code: Alles auswählen

$ cat > foo.txt
This
is
a
test.
[Ctrl-D]
$ sed -i '/^a$/a\
boring' foo.txt
$ cat foo.txt
This
is
a
boring
test.
Das Problem ist nun: 1) bin ich zu faul um beim Pattern die ganze Zeile einzutippen (und all die Quotes zu escapen) und 2) bin ich zu faul um die ganze zweite Zeile erneut einzutippen. Kann man sed irgendwie sagen, es soll die letzte Zeile duplizieren, die gematcht wurde, dabei jedoch noch eine Substitution durchführen?
Zuletzt geändert von paedubucher am 05.05.2014 17:35:32, insgesamt 1-mal geändert.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: Stylesheet-Verweise hinzufügen, mit sed?

Beitrag von uname » 05.05.2014 16:26:19

Wahrscheinlich geht es auch mit "sed". Aber ich denke "awk" ist einfacher zu lesen.

Code: Alles auswählen

awk '{print;if (/doc_screen/) {gsub("doc_screen", "doc_print");print}}' alt.txt > neu.txt
Ich gehe davon aus, dass "doc_screen" und "doc_print" nur in dem Zusammenhang auftritt. Sollte es sonstwo auftauchen wirst du wohl oder übel die Suche sowie den zu substituierenden Ausdruck erweitern müssen.

Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Stylesheet-Verweise hinzufügen, mit sed?

Beitrag von paedubucher » 05.05.2014 16:42:52

Hm, mit awk geht es in der Tat einfacher! Ich kannte leider die gsub-Funktion noch nicht. Ich habe das noch etwas umgeschrieben, sodass es für mich als awk-Anfänger logischer aussieht:

Code: Alles auswählen

{ print; }
/doc_screen/ {
    gsub("doc_screen", "doc_print");
    gsub("screen", "print");
    print;
}
Jede Zeile ausgeben. Wenn es sich um die "doc_screen"-Zeile handelt, wird diese zusätzlich noch einmal unter zwei Ersetzungen ausgegeben. Man könnte auch nur eine Ersetzung machen: screen durch print:

Code: Alles auswählen

{ print; }
/doc_screen/ {
    gsub("screen", "print");
    print;
}
Schon wieder etwas gelernt.
Bei sed habe ich nun etwas weitergegooglet. Da ist oft die Rede von HoldSpace in diesem Zusammenhang, das verstehe ich noch nicht. Man findet auch oft sed-Fragen mit awk-Antworten, es scheint ja allgemein auf jede sed-Frage eine awk-Antwort zu geben...

Nachtrag:
So, jetzt noch den in awk "fehlenden" -i Parameter mit einem Shell-Skript zurechtfrickeln, dann wäre die Aufgabe erledigt

Code: Alles auswählen

#!/bin/sh
for f in *.html
do
    awk -f stylesheet.awk $f > tmp.html
    mv tmp.html $f
done
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Antworten