updated: | 2024 21. March |
published: | 2020 28. August |
sed
Der Streameditor - sed -Zum Suchen verwendet der Zeileneditor reguläre Ausdrücke. Es existieren auch Internetseiten um reguläre Ausdrücke zu testen.
Suchen und ersetzen
sed 's/ *//g' # Alle Leerzeichen entfernen
sed 's/ */ /g' # Mehrfachleerzeichen ersetzen durch ein einzelnes Leerzeichen
sed 's/ \+/\ /g' # Mehrfachleerzeichen ersetzen durch ein einzelnes Leerzeichen
sed 's/^[[:space:]]*//' # Alle Leerzeichen und Tabulatoren zu Beginn einer Zeile löschen (Beachte ohne /g = global)
sed '/meta/s/A/b/' # Sucht alle Zeilen mit "meta" und ersetzt in diesen Zeilen A mit b
Hier gibt’s weitere Referenzen .
Reguläre Ausdrücke und Wiederholungen
Ein kleiner aber vielleicht wichtiger Ausflug in die Welt der regulären Ausdrücke. Ein regulärer Ausdruck (engl.: Regular expressions) ist die Beschreibung einer bestimmten Menge von Zeichen in einer Folge. Wiederholungen von regulären Ausdrücken (kurz RE) werden mit den folgenden Zeichen (Platzhaltern) verarbeitet:
Platzhalter | Beschreibung |
---|---|
* | der RE kommt null oder mehrfach vor |
\+ | der RE kommt mindestens ein oder mehrfach vor |
\? | der RE kommt null oder mindenstens einmal vor |
. | ein beliebiges Zeichen |
Hinweis: Die Platzhalter +
und ?
müssen maskiert werden.
Styles aus HTML-Seiten entfernen
In alten Html-Seiten sind Styles meisten direkt in einem Html-Element integriert. Zum Beispiel:
<th style="border-bottom: 0.5pt solid ; font-weight:normal;" rowspan="2" align="center" valign="middle" charoff="50">Text</th>
Das ist heute nicht mehr erwünscht und wird mit CSS gelöst. Deshalb kann es notwendig sein, die entsprechenden Codezeilen zu entfernen.
sed -re 's/style\=\"[[:alnum:][:space:]\:\.\;\-]*\"//g' input.html > output.html
Erläuterung:
Der regulare Ausdruck style\=\"[[:alnum:][:space:]\:\.\;\-]*\"
beschreibt, dass alles zwischen der Zeichenfolge style="
und dem darauffolgenden ersten Anführungszeichen "
angesprochen wird. In der Tabelle sind nochmal alle regulären Ausdrücke aufgeführt, wobei einige mit einem Backslash \
maskiert sind.
RegExp | Characters |
---|---|
[:alnum:] | alphanumeric [0-9A-Za-z] |
[:space:] | whitespace [\t\n\v\f\r ] |
\: | Doppelpunkt (maskiert) |
\. | Punkt (maskiert) |
\; | Semikolon (maskiert) |
\- | Minuszeichen (maskiert) |
Das Ganze wird in eine eckige Klammer eingepackt und mit Sternchen versehen: [[:alnum:][:space:]\:\.\;\-]*
. Das bedeutet, dass alles mehrfach vorkommen kann.
Weitere Beispiele
RegExp | Beschreibung |
---|---|
border-right:[[:alnum:][:space:].]*\; | alle alphanummeric und whitespace zw. border-right und ; |
border-bottom:[[:alnum:][:space:].]*; | alles zw. border-bottom und ; |
font-weight:[[:alnum:][:space:].]*; | alles zw. font-weight und ; |
style="[[:space:]]*" | style=" " |
Zum Abschluß ein paar Codezeilen um allen möglichen Käse aus HTML-Dateien zu entfernen.
sed \
-re 's/ style\=\"[[:alnum:][:space:]\:\.\;\-]*\"//g' \
-re 's/ align\=\"[[:alnum:][:space:]]*\"//' \
-re 's/ valign\=\"[[:alnum:][:space:]]*\"//' \
-re 's/ charoff\=\"[[:alnum:][:space:]]*\"//' \
-re 's/<t([[:alnum:]]) [[:space:]]*>/<t\1>/' \ # entfernt whitespace in <t? >
-re 's/<\/?span[[:space:]]*>//g' \ # entfernt <span > aber auch <\span>
\
input.html > output.html
cleanhtml
Nachfolgend ein Skript um die Struktur einer Html-Datei zu verändern. Das Skript strukturiert eine Html-Datei um, indem es:
- HTML-Elemente in eine neue Zeile versetzt
- HTML-Elemente teilweise nach rechts verschiebt
- Leerraum (whitespace) am Beginn einer Zeile löscht
- Das Html-Element
<span> </span>
löscht, aber nicht deren Inhalt. - Teilw. Eigenschaften innerhalb eines Elements löscht, wie z.B.:
style align valign charoff
#!/bin/bash
# cleanhtml.sh
# Das Skript strukturiert eine Html-Datei um, indem es:
# 1. HTML-Elemente in eine neue Zeile versetzt
# 2. HTML-Elemente teilweise nach rechts verschiebt
# 3. Leerraum (whitespace) am Beginn einer Zeile löscht
# 4. Das Html-Element <span> </span> löscht, aber nicht der Inhalt.
# 5. Teilw. Eigenschaften innerhalb eines Elements löscht, wie z.B.:
# style align valign charoff
declare inputfile=$1;
declare outfile;
declare tmpfile;
# Prüft Eingabedatei
if [ -z $inputfile ] || [ ! -f $inputfile ]; then
echo -e "\n\tKeine reguläre Datei.";
exit;
fi
tmpfile=$(mktemp atemp.XXXX);
# Erzeugt Ausgabedatei wie Eingabedatei + Temporäre Zeichen
outfile=$(mktemp ${inputfile%.*}.out.XXX.${inputfile##*.})
#echo $outfile;
# Alle Zeilenumbrüch löschen
tr -d '\r\n' < $inputfile > $tmpfile
sed \
-re 's/^[[:space:]]*</</g' \
-re 's/<html/\n<html/g' \
-re 's/<\/html/\n<\/html/g' \
-re 's/<body/\n<body/g' \
-re 's/<\/body/\n<\/body/g' \
-re 's/<head/\n<head/g' \
-re 's/<\/head/\n<\/head/g' \
-re 's/<meta/\n\t<meta/g' \
-re 's/<title/\n\t<title/g' \
-re 's/<link/\n\t<link/g' \
-re 's/<\/meta/\n\t<\/meta/g' \
-re 's/<table/\n\n\n<table/g' \
-re 's/<\/table/\n<\/table/g' \
-re 's/<tbody/\n<tbody/g' \
-re 's/<\/tbody/\n<\/tbody/g' \
-re 's/<tr/\n\t<tr/g' \
-re 's/<\/tr/\n\t<\/tr/g' \
-re 's/<td/\n\t\t<td/g' \
-re 's/<th /\n\t\t<th /g' \
-re 's/<thead/\n<thead/g' \
-re 's/<\/thead/\n<\/thead/g' \
-re 's/<t([[:alnum:]]) [[:space:]]*>/<t\1>/' \
-re 's/<colgroup/\n\t<colgroup/g' \
-re 's/<div/\n\t<div/g' \
-re 's/<\/div/\n\t<\/div/g' \
-re 's/ style\=\"[[:alnum:][:space:]\:\.\;\-]*\"//g' \
-re 's/ align\=\"[[:alnum:][:space:]]*\"//g' \
-re 's/ valign\=\"[[:alnum:][:space:]]*\"//g' \
-re 's/ charoff\=\"[[:alnum:][:space:]]*\"//g' \
-re 's/<\/?span[[:space:]]*>//g' \
\
$tmpfile > $outfile
rm $tmpfile