sed/tr: Zeilenumbruch mit führendem Bindestrich ersetzen

N

nfidia

Jungspund
Hi,

ich hab mir schon einen Wolf abgesucht im Netz, ich kriegs nicht hin:

Eine Text-Datei enthält z.B. folgende 2 Zeilen:

Die Teilnahme an solchen Maß-
nahmen ist gering

Ich möchte, dass das Wort "Maßnahmen" nicht durch ein Bindestrich und einen Zeilenumbruch getrennt ist. Die beiden Zeilen sollen in eine zusammengefasst werden:

Die Teilnahme an solchen Maßnahmen ist gering

Den Zeilenumbruch löschen krieg ich mit sed nicht hin:

Code:
sed 's/\n//' Datei1 > Datei2

=> geht nicht. Der Zeilenumbruch bleibt bestehen

Mit dem Programm tr können auch Zeichen ersetzt werden. Das klappt auch:

Code:
cat Datei1 | tr -d "\n" > Datei2

Dann bleibt aber der Bindestrich übrig:

Die Teilnahme an solchen Maß-nahmen ist gering

Ich habe nicht rausbekommen, wie ich dem Programm beibringe, dass es sowohl den Bindestrich wie auch den Zeilenumbruch in Form eines Strings wie "-\n" löscht.

PS: Diesmal bin ich unter Debian 4.x unterwegs, nicht mit Cygwin.
 
Dankeschön

Hi Aqualung,

vielen Dank für diese Befehlszeile :) - da wäre ich nie drauf gekommen, ich habe bisher nur Basiskenntnisse, würde ich mal sagen, was sed betrifft.

Die Befehlszeile funktioniert aber nicht in jeder Zeile wie gewünscht.

Mir fiel auf, dass wenn drei Zeilen in der Quelldatei so aussehen:

Dies ist die erste Zei-
le und dies ist die zweite Zei-
le und dies ist ...

, dass das Ergebnis dann so aussieht:

Dies ist die erste Zeile und dies ist die zweite Zei-
le und dies ist ...

Außerdem gibt es in einer der Quelldateien und an auch folgenden Zeilenaufbau:

Code:
1. Dies ist die erste Zei-
  le und dies ist die zweite Zeile

Das Ergebnis ist dann:

1. Dies ist die erste Zei-
le und dies ist die zweite Zeile

Deswegen mache ich das so:

Code:
sed 'N;s/-\n//;P;D;' Datei > refined_1.txt
sed 's/  //g' refined_1.txt > refined_2.txt # lösche jeweils zwei Leerzeichen
sed 's/   //g' refined_2.txt > refined_3.txt # lösche jeweils drei Leerzeichen
sed 'N;s/-\n//;P;D;' refined_3.txt > refined_4.txt
sed 'N;s/-\n//;P;D;' refined_4.txt > result.txt

Das ist zwar quick and dirty, aber das Ergebnis - zumindest bei der einen Datei, die ich untersucht habe, ist das gewünschte ;-)
 
Eine weitere effizientere Möglichkeit wäre so:

> cat test.sh

#!/bin/bash
while read line;
do
if [ "${line: -1}" = "-" ];then
echo -n ${line:0:${#line}-1};
else
echo $line;
fi
done < textfile.txt

> cat textfile.txt

aaa bbb ccc-
ccc ddd eee-
eee fff ggg
ggg

> ./test.sh
aaa bbb cccccc ddd eeeeee fff ggg
ggg


lg host


ps: is jetzt ohne form auch nur quick n dirty ...
 
Hi hostmolch,

vielen Dank für Deine Mühe!

Hm, vielleicht sollte ich einfach einen Indexierer nehmen.

Denn ich manipuliere die Textdateien in der beschriebenen Weise (getrennte Wörter wieder zusammenfügen, dabei nacheinander folgende Leerzeichen mit einer Menge >1löschen, damit ich anschließend mittels grep in den Textdateien nach kompletten Begriffen/Strings suchen kann.

Ich guck mir mal

http://regain.sourceforge.net/?lang=de

an, vielleicht macht ja der eingesetzte "intelligente" Indexer genau das, was ich mir vorstelle?
 
Jo mach das mal falls du noch was brauchst melden.

lg Host
 
Zurück
Oben