Multiline String ersetzen Hölle in Perl [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
nudgegoonies
Beiträge: 939
Registriert: 16.02.2009 09:35:10

Multiline String ersetzen Hölle in Perl [gelöst]

Beitrag von nudgegoonies » 18.02.2023 20:46:44

Ich möchte ein und das selbe Duplikat in sehr vielen Textdateien ersetzen. Ich weiß, dass man um Multiline Strings zu ersetzen perl -pi -w -e statt sed -e benutzen muss. Damit endet auch mein Wissen über Perl. Damit kann ich auch Einzeilige Strings mit Multiline Strings ersetzen. Aber Multiline Strings mit Multiline Strings ersetzen geht nicht. Minimalbeispiel:

Code: Alles auswählen

a
b

a
b
Das soll das Ergebnis in der geänderten Datei sein:
a
b
Also habe ich es genauso gemacht, wie ich es immer gemacht habe, nur das jetzt auch Newlines in der linken Seite vorkommen:
perl -pi -w -e 's#a\nb\n\na\nb\n#a\nb\n#g'
Damit dachte ich, ich entferne ich das Duplikat. Ich ersetze zweimal Multiline durch einmal Multiline. Für mich sieht das so aus, als ob er gar nicht Multiline sucht.

Ärgerlich, dass, sed nicht einfach mit \n zurechtkommt. Wenn jemand ein Programm weiß, um einfach Byte-Folgen zu ersetzen, dann nehme ich gerne auch das, weil ich ja gar keine regex (.*, etc.) für Platzhalter brauche, sondern den Textblock Byte-genau kenne.
Zuletzt geändert von nudgegoonies am 18.02.2023 21:19:14, insgesamt 2-mal geändert.
Soft: Bullseye AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon R7 360 MESA.
Hardware: Thinkstation S20, Intel X58, 16GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HDS und DVD+RW.

Benutzeravatar
TRex
Moderator
Beiträge: 8316
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: Multiline String ersetzen Hölle in Perl

Beitrag von TRex » 18.02.2023 20:58:18

Code: Alles auswählen

$ cat foo
a
b

a
b


a
a



a
b

Code: Alles auswählen

$ tr -s '\n' < foo
a
b
a
b
a
a
a
b
Meinst du so?
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

nudgegoonies
Beiträge: 939
Registriert: 16.02.2009 09:35:10

Re: Multiline String ersetzen Hölle in Perl

Beitrag von nudgegoonies » 18.02.2023 21:04:26

Nein. Ich will einen doppelten Textblock durch einen ersetzen.
Folgende riesige Datei enthält:
...
[TolleUnterteilung]
PerlIstKompliziert=true
SedKannKeinMultiline=true

[TolleUnterteilung]
PerlIstKompliziert=true
SedKannKeinMultiline=true
...
Und nach dem Suchen und Ersetzen soll sie so aussehen:
...
[TolleUnterteilung]
PerlIstKompliziert=true
SedKannKeinMultiline=true
...
Soft: Bullseye AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon R7 360 MESA.
Hardware: Thinkstation S20, Intel X58, 16GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HDS und DVD+RW.

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Multiline String ersetzen Hölle in Perl

Beitrag von tobo » 18.02.2023 21:08:07

nudgegoonies hat geschrieben: ↑ zum Beitrag ↑
18.02.2023 20:46:44
Ärgerlich, dass, sed nicht einfach mit \n zurechtkommt.
Sagt wer?

Code: Alles auswählen

sed -z 's/a\nb\n\na\nb\n/a\nb\n/g'

nudgegoonies
Beiträge: 939
Registriert: 16.02.2009 09:35:10

Re: Multiline String ersetzen Hölle in Perl

Beitrag von nudgegoonies » 18.02.2023 21:18:38

Diverse stack* Seiten wenn man nach replace multiline string sucht.

Auf jeden Fall vielen Dank :THX:

Ich habe sogar die Manpage von sed aufgehabt, habe den -z Parameter aber nicht wirklich verstanden:
-z, --null-data

Zeilen durch NUL-Zeichen trennen
Soft: Bullseye AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon R7 360 MESA.
Hardware: Thinkstation S20, Intel X58, 16GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HDS und DVD+RW.

Benutzeravatar
Meillo
Moderator
Beiträge: 9224
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Multiline String ersetzen Hölle in Perl

Beitrag von Meillo » 18.02.2023 21:29:36

nudgegoonies hat geschrieben: ↑ zum Beitrag ↑
18.02.2023 21:18:38
Ich habe sogar die Manpage von sed aufgehabt, habe den -z Parameter aber nicht wirklich verstanden:
-z, --null-data

Zeilen durch NUL-Zeichen trennen
Dadurch wird Newline zu einem ganz normalen Zeichen. Sed trennt Zeilen dann bei Null-Bytes. D.h. alles bis zum naechsten Null-Byte ist eine Zeile. Bei normalen Textdaten (die keine Null-Bytes enthalten) ist dann die ganzen Datei eine Zeile.

(Eigentlich kommt diese Option von den Programmen, die typischerweise mit Dateinamen arbeiten, um diese sicher zu machen gegen Fehler mit Dateinamen, die Newlines enthalten.)
Use ed once in a while!

nudgegoonies
Beiträge: 939
Registriert: 16.02.2009 09:35:10

Re: Multiline String ersetzen Hölle in Perl [gelöst]

Beitrag von nudgegoonies » 18.02.2023 21:42:16

Danke Dir. Ich glaube, jetzt kapiere ich langsam. Dadurch behandelt er das File nicht zeilenweise sondern ersetzt die Newlines vorher durch \0 und behandelt dadurch das ganze File wie eine große Zeile. Verrückt.
Soft: Bullseye AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon R7 360 MESA.
Hardware: Thinkstation S20, Intel X58, 16GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HDS und DVD+RW.

Benutzeravatar
Meillo
Moderator
Beiträge: 9224
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Multiline String ersetzen Hölle in Perl [gelöst]

Beitrag von Meillo » 18.02.2023 22:01:45

nudgegoonies hat geschrieben: ↑ zum Beitrag ↑
18.02.2023 21:42:16
Dadurch behandelt er das File nicht zeilenweise sondern ersetzt die Newlines vorher durch \0 und behandelt dadurch das ganze File wie eine große Zeile. Verrückt.
Das waere wirklich verrueckt, aber sed ersetzt hierbei nichts. Es sieht nur ein anderes Zeichen als Zeilentrenner an.

Falls du es dir im Code anschauen willst. Hier ist der Source Code zu GNU sed:
https://git.savannah.gnu.org/gitweb/?p= ... ed;hb=HEAD
Die relevante Variable ist `buffer_delimiter'.
Use ed once in a while!

Antworten