humanoid1
Anmeldungsdatum: 15. März 2022
Beiträge: 32
Wohnort: Jena
|
Guten Tag, heute bitte ich euch um eure Hilfe.
In einer seperaten sedfile habe ich ich die gewünschten Ersetzungen eingetragen. Aber mit dem Maskieren der Sonderzeichen komme ich nicht klar. Probiert habe ich beide Schrägstriche, Hochkomma, Anführungszeichen und sogar Prozentzeichen. Hier mein Inhalt der sedfile:
s.\Fr.\.Frau.g
s.Herrman.Herman.g
s.Muecke.Elefant.g
s.M\ü\cke.Elefant.g
s/ */ /g
Herrman und Muecke werden korrekt ersetzt.
Danke vielmals für eure Zeit!
|
karzer
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1240
Wohnort: Bad Oeynhausen
|
humanoid1 schrieb: Guten Tag, heute bitte ich euch um eure Hilfe.
In einer seperaten sedfile habe ich ich die gewünschten Ersetzungen eingetragen. Aber mit dem Maskieren der Sonderzeichen komme ich nicht klar. Probiert habe ich beide Schrägstriche, Hochkomma, Anführungszeichen und sogar Prozentzeichen. Hier mein Inhalt der sedfile:
s.\Fr.\.Frau.g
s.Herrman.Herman.g
s.Muecke.Elefant.g
s.M\ü\cke.Elefant.g
s/ */ /g
Herrman und Muecke werden korrekt ersetzt.
Danke vielmals für eure Zeit!
Hallo, möchtest du Fr. oder Fr ersetzen? Außerdem muss ü nicht maskiert werden:
Für Fr. würde ich das so machen:
s.Fr\..Frau.g
s.Herrman.Herman.g
s.Muecke.Elefant.g
s.Mücke.Elefant.g
s/ */ /g
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 32
Wohnort: Jena
|
Danke! Das hat mit "Fr." und "Mücke" funktioniert. Ich dachte, dass das Escapen auf beiden Seiten erfolgen musste. Kann man auch so im Inhalt aus mehreren Leerzeilen auf nur eine Leerzeile ändern?
|
karzer
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1240
Wohnort: Bad Oeynhausen
|
humanoid1 schrieb: Kann man auch so im Inhalt aus mehreren Leerzeilen auf nur eine Leerzeile ändern?
Etwa so: .^[[:space:]]*$.d
/ */d Das löscht aber alle Leerzeilen. Es ist nicht getestet, so aber geht es: echo "" | sed '/^[[:space:]]*$/d'
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 32
Wohnort: Jena
|
Dank an karzer. Der Gedanke mit der sed-Variablen space ist gut. Funktioniert leider nicht in einer sedfile, hatte ich schon mal so ähnlich versucht.
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 32
Wohnort: Jena
|
Hallo karzer, funktioniert doch!
Nur eben sind alle Leerzeilen hin und weg ☺)
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 32
Wohnort: Jena
|
Thema Leerzeilen entfernen, aber eine Leerzeile jeweils erhalten wurde auch schon hier behandelte. https://forum.ubuntuusers.de/topic/sed-leerzeilen-loeschen/
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12713
|
humanoid1 schrieb:
In einer seperaten sedfile habe ich ich die gewünschten Ersetzungen eingetragen. Aber mit dem Maskieren der Sonderzeichen komme ich nicht klar. Probiert habe ich beide Schrägstriche, Hochkomma, Anführungszeichen und sogar Prozentzeichen. Hier mein Inhalt der sedfile:
s.\Fr.\.Frau.g
s.Herrman.Herman.g
s.Muecke.Elefant.g
s.M\ü\cke.Elefant.g
s/ */ /g
Punkte als Trenner zu verwenden ist eine schlechte Idee, weil der Punkt an sich ein Metazeichen ist. So, wie Du das gemacht hast, findet der erste Ausdruck exakt "Fr" und ersetzt es durch ".Frau": | $ echo 'Fr.' | sed 's.\Fr.\.Frau.g'
.Frau.
$ echo 'Fr.' | sed 's.\Fr.<\.Frau>.g'
<.Frau>.
$ echo 'FrX' | sed 's.\Fr.<\.Frau>.g'
<.Frau>X
$ echo 'Fr' | sed 's.\Fr.<\.Frau>.g'
<.Frau>
|
Der Backslash vor dem ersten "F" ist nutzlos, weil die Sequenz "\F" keine besondere Bedeutung hat - der fällt einfach unter den Tisch. Der zweite Backslash ist nötig, weil sonst der folgende Punkt als Begrenzer des Ersetzungsausdrucks erkannt wird. Einfacher ist es "/" oder "#" als Trenner nach dem "s"-Kommando zu verwenden.
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 32
Wohnort: Jena
|
Hallo rklm, also das mit dem Punkt sehe ich ein, daher danke, und habe die Punkte jeweils durch Frontslash ersetzt.
Und es funktioniert tatsächlich. Trotzdem ist im gesamten Forum das löschen von mehreren Leerzeilen zugunsten jeweilig einer Leerzeile noch nicht gelöst.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11109
Wohnort: München
|
humanoid1 schrieb: Trotzdem ist im gesamten Forum das löschen von mehreren Leerzeilen zugunsten jeweilig einer Leerzeile noch nicht gelöst.
Das würde ich nicht unbedingt mit einem Tool machen, das zeilenbasiert arbeitet - unter der Voraussetzung, dass der Text in den RAM passt, bietet sich da ein Perl-Einzeiler an:
perl -0pe 's/\n{3,}/\n\n/gms' datei.txt
# oder wenn die Änderung direkt in die Datei geschrieben werden soll:
perl -i -0pe 's/\n{3,}/\n\n/gms' datei.txt
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12713
|
humanoid1 schrieb:
Trotzdem ist im gesamten Forum das löschen von mehreren Leerzeilen zugunsten jeweilig einer Leerzeile noch nicht gelöst.
cat -s
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12713
|
rklm schrieb: humanoid1 schrieb:
Trotzdem ist im gesamten Forum das löschen von mehreren Leerzeilen zugunsten jeweilig einer Leerzeile noch nicht gelöst.
cat -s
Oder auch wie hier beschrieben. Gefunden via diese Suche.
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 32
Wohnort: Jena
|
An allen vielen Dank. Diese gemeinsame Lösung funktioniert. /^$/N;/^\n$/D
s/Fr\./Frau/g
s/Hr\./Herr/g
s/Mücke/Elefant/g Zeile 1: Auch das Löschen mehrerer Leerzeilen zugunsten einer Leerzeile funktioniert.
Zeile 2 und 3: In den ersten beiden Ersetzungen, wird der Punkt von "Fr." und "Hr." mit dem Escape-Zeichen maskiert.
Zeile 4: Ein deutscher Umlaut muss nicht maskiert werden. Wobei beachtet werden muss, das löschen der Leerzeilen muss unbedingt an erster Stelle in der sedfile gesetzt werden, sonst funktioniert es nicht. Warum das so ist kann ich nicht erklären.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12713
|
humanoid1 schrieb:
Wobei beachtet werden muss, das löschen der Leerzeilen muss unbedingt an erster Stelle in der sedfile gesetzt werden, sonst funktioniert es nicht. Warum das so ist kann ich nicht erklären.
Führ sed mal mit der Option --debug aus. Auch info sed ist hilfreich, weil es mehr Infos zur Arbeitsweise von sed liefert als die Manpage. Wenn ich das richtig verstehe, liegt das daran, dass "N" eine Zeile in den Pattern Space lädt, ohne dass die davorliegenden "s"-Kommandos ausgeführt werden, und "D" dann wegen der Adresse /^\n$/ nicht ausgeführt wird und der Zyklus endet inkl. Ausgabe des Pattern Space.
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 32
Wohnort: Jena
|
Dank an rklm. Also ich lese schon eine Weile die "info sed", doch den Absatz warum Zeile vor Wort geht, habe ich noch nicht gefunden. Ich vermute eine Logik dahinter, denn warum erst die Zeichen und Wörter ersetzen, wenn ohnehin die Zeile entfernt wird. Oder die Vermutung von rklm ist zutreffend. Guts Nächtle Ich werde spätestens am Montag, hier "Gelöst" setzen.
|