Absatzweise Ersetzungen

Hallo zusammen,

ich habe eine Text-Datei mit mehreren tausend Zeilen, in der Absätze
durch eine Leerzeile gekennzeichnet sind. Es handelt sich um
transkribierte Interviews, die mit LaTeX gesetzt und zu diesem Zweck
entsprechend ausgezeichnet werden sollen. Beispiel aus Original-Datei:

-----------------------------------
I: Zuerst einmal herzlichen Dank für Ihre Bereitschaft am Interview
teilzunehmen. Ich möchte etwas über ihr Ernährungsverhalten
erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?

A: Morgens esse ich ausschließlich Obst und trinke nur Wasser.
Kaffee mochte ich noch nie. Wasser belebt mich.
-----------------------------------

Daraus soll werden:

-----------------------------------
\interviewer{Zuerst einmal herzlichen Dank für Ihre Bereitschaft am
Interview teilzunehmen. Ich möchte etwas über ihr
Ernährungsverhalten erfahren. Mit welchen Lebensmitteln starten Sie
in den Tag?}

\antwort{Morgens esse ich ausschließlich Obst und trinke nur Wasser.
Kaffee mochte ich noch nie. Wasser belebt mich.}
-----------------------------------

Leider gelingt mir dies wegen der Zeilenumbrüche nicht. Folgendes
habe ich unter anderem versucht (erstmal nur auf »I:« beschränkt):

perl -pi.bak -e 's/I:(.*)/\\interviewer\{\1\}/gs' Interview.tex

ignoriert alles ab dem ersten Zeilenumbruch (habe ich das mit dem
/s-Modifier falsch verstanden?).

perl -pi.bak -e 's/I:([\d\D]*)/\\interviewer\{\1\}/g' Interview.tex

dito.

Ich bin weder Programmierer noch Informatiker und brauche Perl nur
gelegentlich für solche Dinge. Bisher hat das auch gut geklappt. Nur
jetzt komme ich auch mit dem Lama-Buch nicht weiter. Was muss ich
tun, damit die Zeilenumbrüche innerhalb eines Absatzes miteinbezogen
werden und gleichzeitig die Leerzeilen als Ende eines Absatzes
erkannt werden? Dass \n auf die Zeilenumbrüche passt, konnte ich mit

perl -pi.bak -e 's/\n//g' Interview-berty.tex

überprüfen. Dann habe ich eine einzige lange Zeile in der Datei ;-).

Ich arbeite unter Debian mit Perl 5.8.4.

Viele Grüße,
Christoph
--
+++ Typografie-Regeln: http://www.zvisionwelt.de/typokurz.pdf (1.4)
Christoph Bier [ Do, 18 Mai 2006 14:01 ] [ ID #1320584 ]

Re: Absatzweise Ersetzungen

Christoph Bier <christoph.bier [at] web.de> writes:

> [...] ich habe eine Text-Datei mit mehreren tausend Zeilen, in der
> Absätze durch eine Leerzeile gekennzeichnet sind. [...]

> -----------------------------------
> I: Zuerst einmal herzlichen Dank für Ihre Bereitschaft am Interview
> teilzunehmen. Ich möchte etwas über ihr Ernährungsverhalten
> erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?
>
> A: Morgens esse ich ausschließlich Obst und trinke nur Wasser.
> Kaffee mochte ich noch nie. Wasser belebt mich.
> -----------------------------------
>
> Daraus soll werden:
>
> -----------------------------------
> \interviewer{Zuerst einmal herzlichen Dank für Ihre Bereitschaft am
> Interview teilzunehmen. Ich möchte etwas über ihr
> Ernährungsverhalten erfahren. Mit welchen Lebensmitteln starten Sie
> in den Tag?}
>
> \antwort{Morgens esse ich ausschließlich Obst und trinke nur Wasser.
> Kaffee mochte ich noch nie. Wasser belebt mich.}
> -----------------------------------
> [...]

Zuersteinmal: Vielen Dank für die sonnenklar formulierte Frage. Wir
sind hier diesbezüglich Kummer gewohnt.

Mein Vorschlag:

perl -p000le 's/^I:(.*)/\\interviewer\{\1\}/gs;s/^A:(.*)/\\antwort\{\1\}/ gs'

-0 setzt den input-record-seperator ($/); Der Wert 00 sorgt dafür,
dass Perl Paragraphen liest.

-l Setzt den output-record-seperator ($\); Kein Wert bedeutet, nehme
den selben wie für $/.

Peter
--
Dipl.-Ing. Peter Ehrenberg Tel.: +49 40 756604-40
Auf der Höhe 29 Netz: http://dipe.de/
21109 Hamburg Perl · Oracle · Linux · Netzwerk
Germany Softwareentwicklung · Installation · Administration
Peter Ehrenberg [ Do, 18 Mai 2006 14:48 ] [ ID #1320585 ]

Re: Absatzweise Ersetzungen

Peter Ehrenberg schrieb am 18.05.2006 14:48:

> Christoph Bier <christoph.bier [at] web.de> writes:

[...]

> Zuersteinmal: Vielen Dank für die sonnenklar formulierte Frage. Wir
> sind hier diesbezüglich Kummer gewohnt.

Ich kenne das Problem aus de.comp.text.tex.

> Mein Vorschlag:
>
> perl -p000le 's/^I:(.*)/\\interviewer\{\1\}/gs;s/^A:(.*)/\\antwort\{\1\}/ gs'
>
> -0 setzt den input-record-seperator ($/); Der Wert 00 sorgt dafür,
> dass Perl Paragraphen liest.
>
> -l Setzt den output-record-seperator ($\); Kein Wert bedeutet, nehme
> den selben wie für $/.

Hervorragend! Herzlichen Dank! Sieht so aus, als habe alles
funktioniert.

Schöne Grüße,
Christoph
--
+++ Typografie-Regeln: http://www.zvisionwelt.de/typokurz.pdf (1.4)
Christoph Bier [ Do, 18 Mai 2006 15:45 ] [ ID #1320588 ]

Re: Absatzweise Ersetzungen

Christoph Bier wrote:
[...]
> -----------------------------------
> I: Zuerst einmal herzlichen Dank für Ihre Bereitschaft am Interview
> teilzunehmen. Ich möchte etwas über ihr Ernährungsverhalten
> erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?
>
> A: Morgens esse ich ausschließlich Obst und trinke nur Wasser.
> Kaffee mochte ich noch nie. Wasser belebt mich.
> -----------------------------------
>
> Daraus soll werden:
>
> -----------------------------------
> \interviewer{Zuerst einmal herzlichen Dank für Ihre Bereitschaft am
> Interview teilzunehmen. Ich möchte etwas über ihr
> Ernährungsverhalten erfahren. Mit welchen Lebensmitteln starten Sie
> in den Tag?}
>
> \antwort{Morgens esse ich ausschließlich Obst und trinke nur Wasser.
> Kaffee mochte ich noch nie. Wasser belebt mich.}
> -----------------------------------


perl -p000e 's/(?<=-\n)I:\s*(.+?)\s*$/\\interviewer{\1}\n/s;
s/A:\s*(.+)(?=\n-+)/\n\\antwort{\1}/s;' file


Gruß,
Lars Klemstein
Lars Klemstein [ Sa, 20 Mai 2006 12:12 ] [ ID #1322985 ]

Re: Absatzweise Ersetzungen

Lars Klemstein schrieb am 20.05.2006 12:12:

> Christoph Bier wrote:
> [...]
>
>>-----------------------------------
>>I: Zuerst einmal herzlichen Dank für Ihre Bereitschaft am Interview
>>teilzunehmen. Ich möchte etwas über ihr Ernährungsverhalten
>>erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?
>>
>>A: Morgens esse ich ausschließlich Obst und trinke nur Wasser.
>>Kaffee mochte ich noch nie. Wasser belebt mich.
>>-----------------------------------
>>
>>Daraus soll werden:
>>
>>-----------------------------------
>>\interviewer{Zuerst einmal herzlichen Dank für Ihre Bereitschaft am
>>Interview teilzunehmen. Ich möchte etwas über ihr
>>Ernährungsverhalten erfahren. Mit welchen Lebensmitteln starten Sie
>>in den Tag?}
>>
>>\antwort{Morgens esse ich ausschließlich Obst und trinke nur Wasser.
>>Kaffee mochte ich noch nie. Wasser belebt mich.}
>>-----------------------------------
>
> perl -p000e 's/(?<=-\n)I:\s*(.+?)\s*$/\\interviewer{\1}\n/s;
> s/A:\s*(.+)(?=\n-+)/\n\\antwort{\1}/s;' file

Danke, ich bin allerdings jetzt erst zum Testen gekommen. Mit diesem
Aufruf funktioniert das Ersetzen nicht:

chris [at] lotus:/tmp$ perl -p000e
's/(?<=-\n)I:\s*(.+?)\s*$/\\interviewer{\1}\n/s;
s/P:\s*(.+)(?=\n-+)/\n\\antwort{\1}/s;' interv.tex > interv-conv.tex
chris [at] lotus:/tmp$ diff interv.tex interv-conv.tex
951d950
<
1290d1288
<

Grüße,
Christoph
--
+++ Typografie-Regeln: http://www.zvisionwelt.de/typokurz.pdf (1.4)
Christoph Bier [ Do, 25 Mai 2006 10:39 ] [ ID #1330044 ]

Re: Absatzweise Ersetzungen

Christoph Bier wrote:
[...]
> Danke, ich bin allerdings jetzt erst zum Testen gekommen. Mit diesem
> Aufruf funktioniert das Ersetzen nicht:
>
> chris [at] lotus:/tmp$ perl -p000e
> 's/(?<=-\n)I:\s*(.+?)\s*$/\\interviewer{\1}\n/s;
> s/P:\s*(.+)(?=\n-+)/\n\\antwort{\1}/s;' interv.tex > interv-conv.tex
> chris [at] lotus:/tmp$ diff interv.tex interv-conv.tex
> 951d950
> <
> 1290d1288
> <

Hmh... kann ich nicht nachvollziehen:

$ cat file

----------------------------------
I: Zuerst einmal herzlichen Dank für Ihre Bereitschaft am Interview
teilzunehmen. Ich möchte etwas über ihr Ernährungsverhalten
erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?

A: Morgens esse ich ausschließlich Obst und trinke nur Wasser.
Kaffee mochte ich noch nie. Wasser belebt mich.
-----------------------------------

$ perl -p000e
's/(?<=-\n)I:\s*(.+?)\s*$/\\interviewer{\1}\n/s;^Js/A:\s*(.+)(? >
----------------------------------
\interviewer{Zuerst einmal herzlichen Dank für Ihre Bereitschaft am
Interview teilzunehmen. Ich möchte etwas über ihr Ernährungsverhalten
erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?}

\antwort{Morgens esse ich ausschließlich Obst und trinke nur Wasser.
Kaffee mochte ich noch nie. Wasser belebt mich.}
-----------------------------------

$


Das Ergebnis entspricht exakt der Anforderung aus dem Ursprungspost.
Was funktioniert denn bei Dir konkret nicht?


Gruß,
Lars Klemstein
Lars Klemstein [ Do, 25 Mai 2006 17:34 ] [ ID #1330045 ]

Re: Absatzweise Ersetzungen

Lars Klemstein schrieb am 25.05.2006 17:34:

> Christoph Bier wrote:
> [...]
>
>>Danke, ich bin allerdings jetzt erst zum Testen gekommen. Mit diesem
>>Aufruf funktioniert das Ersetzen nicht:
>>
>>chris [at] lotus:/tmp$ perl -p000e
>>'s/(?<=-\n)I:\s*(.+?)\s*$/\\interviewer{\1}\n/s;
>>s/P:\s*(.+)(?=\n-+)/\n\\antwort{\1}/s;' interv.tex > interv-conv.tex
>>chris [at] lotus:/tmp$ diff interv.tex interv-conv.tex
>>951d950
>><
>>1290d1288
>><
>
> Hmh... kann ich nicht nachvollziehen:
>
> $ cat file
>
> ----------------------------------
> I: Zuerst einmal herzlichen Dank für Ihre Bereitschaft am Interview
> teilzunehmen. Ich möchte etwas über ihr Ernährungsverhalten
> erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?
>
> A: Morgens esse ich ausschließlich Obst und trinke nur Wasser.
> Kaffee mochte ich noch nie. Wasser belebt mich.
> -----------------------------------
>
> $ perl -p000e
> 's/(?<=-\n)I:\s*(.+?)\s*$/\\interviewer{\1}\n/s;^Js/A:\s*(.+)(? >
> ----------------------------------
> \interviewer{Zuerst einmal herzlichen Dank für Ihre Bereitschaft am
> Interview teilzunehmen. Ich möchte etwas über ihr Ernährungsverhalten
> erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?}
>
> \antwort{Morgens esse ich ausschließlich Obst und trinke nur Wasser.
> Kaffee mochte ich noch nie. Wasser belebt mich.}
> -----------------------------------
>
> $
>
> Das Ergebnis entspricht exakt der Anforderung aus dem Ursprungspost.
> Was funktioniert denn bei Dir konkret nicht?

Naja, es ändert sich durch den Aufruf nur das, was das diff auch
angezeigt hat. Auch wenn ich jetzt einfach mal die zwei
exemplarischen Absätze nehme, die Du auch verwendet hast,
funktioniert es nicht:

chris [at] skull:/tmp$ cat conv.tex
I: Zuerst einmal herzlichen Dank fuer Ihre Bereitschaft am Interview
teilzunehmen. Ich moechte etwas ueber ihr Ernaehrungsverhalten
erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?

A: Morgens esse ich ausschliesslich Obst und trinke nur Wasser.
Kaffee mochte ich noch nie. Wasser belebt mich.
chris [at] skull:/tmp$ perl -p000e
's/(?<=-\n)I:\s*(.+?)\s*$/\\interviewer{\1}\n/s;
s/A:\s*(.+)(?=\n-+)/\n\\antwort{\1}/s;' conv.tex
I: Zuerst einmal herzlichen Dank fuer Ihre Bereitschaft am Interview
teilzunehmen. Ich moechte etwas ueber ihr Ernaehrungsverhalten
erfahren. Mit welchen Lebensmitteln starten Sie in den Tag?

A: Morgens esse ich ausschliesslich Obst und trinke nur Wasser.
Kaffee mochte ich noch nie. Wasser belebt mich.

Grüße,
Christoph

PS: Ich kann derzeit wegen Umzugs nur stark verzögert reagieren.
--
+++ Typografie-Regeln: http://www.zvisionwelt.de/typokurz.pdf (1.4)
Christoph Bier [ So, 28 Mai 2006 12:33 ] [ ID #1332801 ]
Perl » de.comp.lang.perl.misc » Absatzweise Ersetzungen

Vorheriges Thema: Palm datebook lesen tungsten e2
Nächstes Thema: if in while oder if vor while?