ubuntuusers.de

sed-Skript mit mehreren Befehlen

Status: Ungelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

ciciban

Anmeldungsdatum:
23. Januar 2006

Beiträge: 655

Servus,

Ich scheitere gerade daran, ein sed-Skript mit mehreren Befehlen zum Laufen zu bringen. Es soll in einem Text

  • Erst die <br />-Tags durch Leerzeichen ersetzen

  • Dann die \n (Umbrüche) durch Leerzeichen ersetzen

  • Dann (am liebsten iterativ, aber darum wird es wohl erst später gehen) alle doppelten Leerzeichen durch einfache ersetzen.

Mein Skript lautet:

s#<br /># #g
:a;N;$!ba;s/\n/ /g
s/  / /g

Und ich starte es mit sed -f skript text.

Obwohl die Teile mit der -e-Option anscheinend funktionieren, läuft es mit dem Skript schief.

Wo ist der Wurm?

Danke voraus.

ciciban

(Themenstarter)

Anmeldungsdatum:
23. Januar 2006

Beiträge: 655

Gut, ich kann mit

sed ':a;N;$!ba;s/\n/ /g' text>tmp;sed -e 's#<br /># #g' -e 's/  / /g' -e 's#<p> #<p>#g' -e 's#</p> #</p>#g' tmp>text

herumturnen.

Trotzdem wüsste ich gerne, wie ich in ein sed-Skript mehrere Befehle packe.

Seebär

Avatar von Seebär

Anmeldungsdatum:
2. Mai 2009

Beiträge: 833

Ich empfehle den Artikel sed zu lesen. Da steht u.a.:

Das Ergebnis wird auf der Standardausgabe ausgegeben. Wird keine Datei angegeben, so wird die Standardeingabe verwendet.

Was dem einen sein out, ist des anderen in. Also ggf pipen?

Angeben eines sed-Skriptes, mehrere sed-Skripte sind möglich...

Ferner sind die dort verlinkten Artikel "sed1line" und vor allem "sed-Tutorium" zu empfehlen!

Generell spricht aber nix dagegen 3x sed aufzurufen wenn man 3 Aktionen braucht. sed ist schnell. Hängt natürlich auch von der Datenmenge ab. Wenn wir nicht von mehreren GB reden ist es egal. Dein letzter Einzeiler ist übrigens maximal unleserlich (und die tmp-Datei braucht man nicht. Wenn, dann erzeugt man sie auch anders), es geht doch nicht darum alles in eine Zeile zu klatschen.

Ich empfehle auch eher keine "sed-Files" zu nutzen sondern das Ganze direkt im shell-Skript abzufackeln. Hat zwar den Nachteil des zusätzlichen Escaping, der Code bleibt aber an einer Stelle und vor allem ist damit Dynamik in Form von Shell-Variablen möglich, was du mit Files nicht hinbekommst.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

ciciban schrieb:

Wo ist der Wurm?

Ich denke die erste Ersetzung muss man nach dem Setzen des Labels machen, sonst gibt es mit Überbleibseln Probleme, wenn er das Zeilenende löscht und statt zwei Leerzeichen durch eines zu ersetzen könnte man in dem Fall eigentlich auch beliebig viele Leerzeichen durch ein einzelnes ersetzen:

$ cat replace.sed
:a
s#<br /># #g
N;$!ba;s/\n/ /g
s/ \+/ /g

Scheint hier zumindest zu funktionieren:

$ cat foo.txt
bla<br />spam bar baz
foo barz<br />
blip blup

$ sed -f replace.sed foo.txt
bla spam bar baz foo barz blip blup

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

ciciban schrieb:

  • Dann (am liebsten iterativ, aber darum wird es wohl erst später gehen) alle doppelten Leerzeichen durch einfache ersetzen.

Für solche Aktionen würde ich nicht sed, sondern eher tr nehmen. Zum Eindampfen mehrerer identischer aufeinanderfolgender Zeichen ist dieses Programm besser geeignet.

ciciban

(Themenstarter)

Anmeldungsdatum:
23. Januar 2006

Beiträge: 655

Danke für die Hilfe.

Der Auftrag, wo ich es ungefähr 1000 Mal gebraucht hätte, hat sich leider zerschlagen. 😢

Das Problem ist gelöst.

Antworten |