ubuntuusers.de

Skript optisch anpassen

Status: Ungelöst | Ubuntu-Version: Kubuntu 19.10 (Eoan Ermine)
Antworten |

moonwalker3

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

In einem Skript lade ich mit curl verschiedene HTML-Seiten, diese werden dann mit vielen sed-Statements gefiltert.

Das Skript funktioniert soweit. Wäre es möglich, die verschiedenen sed-Statements untereinander zu schreiben und statt mit | anders abzutrennen? Das würde das Skript übersichtlicher machen. Oder habt ihr eine andere Idee?

Thomas_Do Team-Icon

Moderator
Avatar von Thomas_Do

Anmeldungsdatum:
24. November 2009

Beiträge: 8808

Du kannst mit dem Backslash "\" jede Zeile (auch mehrfach) unterbrechen und dadurch bestimmte Teile untereinander schreiben.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

1
sed 'statement1; statement2; statement3' FILE

hat oft den gleichen Effekt wie

1
sed 'statement1' FILE | sed 'statement2' | sed 'statement3' 

aber nicht immer. Etwa wenn Du in Statement 1 Zeile 1 löschst, dann beginnt die Zählung des zweiten Statements eine Zeile später. Das erste Skript führt für Zeile 1 erst die 3 Statements aus, dann bearbeitet es Zeile 2. Die zweite Version dagegen wendet immer erst das Statement auf die ganze Datei zeilenweise an.

1
sed -f code.sed FILE

ist nochmal eine Variante. Da schreibst Du die Statements in eine externe Datei:

1
2
3
4
# code.sed
statement1
statement2
statement3

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

moonwalker3 schrieb:

Das Skript funktioniert soweit. Wäre es möglich, die verschiedenen sed-Statements untereinander zu schreiben und statt mit | anders abzutrennen? Das würde das Skript übersichtlicher machen. Oder habt ihr eine andere Idee?

Ein Tool nehmen, das für den Umgang mit HTML-Inhalten gemacht ist, z.B. xmlstarlet (braucht u.U. eine Umwandlung nach XHTML mittels tidy). Ich persönlich nehme immer Ruby mit Mechanize und Nokogiri dafür. Da kann man dann sehr elegant XPath nutzen und hat außerdem die Flexibilität einer Programmiersprache zur Verfügung.

moonwalker3

(Themenstarter)

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

@Thomas_Do: Die Lösung mit dem Backslash scheint zu funktionieren. Sieht nur ungewohnt aus, am Zeilenende ein "|\" stehen zu haben.

@user_unknown: Die sed-Statements auszulagern klingt interessant. Kann ich da auch tr und grep mit einbauen?

@rklm: Ich möchte in meinem Skript einige <img>-Tags filtern und einige HTML-Codes (z.B. &uuml;) ersetzen. Kann das xmlstarlet auch?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

moonwalker3 schrieb:

@user_unknown: Die sed-Statements auszulagern klingt interessant. Kann ich da auch tr und grep mit einbauen?

Eine Variante wäre vielleicht auch, eine oder mehrere Shell-Funktionen zu nutzen. Oder man macht es mit dieser Technik - dann braucht man keine externe Datei:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ seq 1 10 | sed -f <(cat <<'SED_SCRIPT'
s#1#X#g
s#0#@#g
SED_SCRIPT
)
X
2
3
4
5
6
7
8
9
X@

@rklm: Ich möchte in meinem Skript einige <img>-Tags filtern und einige HTML-Codes (z.B. &uuml;) ersetzen. Kann das xmlstarlet auch?

Ja.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

moonwalker3 schrieb:

@user_unknown: Die sed-Statements auszulagern klingt interessant. Kann ich da auch tr und grep mit einbauen?

Statt tr verwendet man in Sed den y-Befehl:

1
echo Corona | sed "y/oC/eV/" 

Grepbefehle kann man i.d.R. auch mit Sedinternas abdecken, was willst Du denn greppen?

Antworten |