ubuntuusers.de

leerzeilenproblem

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

bob_sheknowdas

Anmeldungsdatum:
10. Oktober 2011

Beiträge: Zähle...

hi

ich versuche gerade über ein shellscript in einigen meiner dateien die umlaute umzuschreiben. das funktioniert auch ganz gut. was jedoch nicht funktioniert ist de zeilenumbruch. dort, wo in der originaldatei 5 absätze waren ist in der ergebnisdatei nur noch eine ewig lange zeile (zumindest manchmal - manchmal funktionierts eigenartigerweise auch so, wie ichs mir vorstelle)... ein weiteres problem ist, dass beim ersten durchlauf immer eine leezeile an das ende der datei gehängt wird. beim 2. durchlauf (passiert durchaus, dass ich eine datei 2 mal überarbeiten lasse) wird dann die letzte zeile doppelt ausgegeben und wieder eine leerzeile angehängt...

hier mal das script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/bin/bash
zeilenF=$(wc -l $1 |cut -d' ' -f1) 
zeilenT=$((zeilenF+1))
:>unwarscheinlichdassnocheinedateisoheißt.txt
for ((i=1; i<=$zeilenT; i++)); do
	string=`head -n $i $1 | tail -n 1`
	#echo $string
	ergeb=$(echo $string | egrep -v "^#" | grep -v "^$" | wc -l)
	#echo $ergeb
	if [ $ergeb -ne 0 ] ; then
		echo $string | egrep -v "^#" | grep -v "^$" | sed 's/\ä/ae/g;s/\Ä/Ae/g;s/\ö/oe/g;s/\Ö/Oe/g;s/\ü/ue/g;s/\Ü/Ue/g;s/\ß/ss/g' >> unwarscheinlichdassnocheinedateisoheißt.txt
	else		
		echo $string >> unwarscheinlichdassnocheinedateisoheißt.txt
	fi
done

rm $1
mv unwarscheinlichdassnocheinedateisoheißt.txt $1

nochmal zur Verdeutlichung,hier meine Ursprungsdatei:

	ähnliche 
	Sätze
		
	# ein Kommentar mit ä und Ä
	
	der Äther

Nach dem ersten Durchlauf:

	aehnliche
	Saetze
		
	# ein Kommentar mit ä und Ä
	
	der Aether

Nach dem 2. Durchlauf:

	aehnlicheSaetze
		
	# ein Kommentar mit ä und Ä
	
	der Aetherder Aether

(Leerzeile unter "der Aether" nach dem 1. Durchlauf, doppeltes "der Aether" nach dem 2. Durchlauf sowie plötzliches vergessen des Zeilenumbruchs nach "aehnliche" nach dem 2. Durchlauf beachten)

ich hoffe ihr könnt mir helfen. vielen dank im vorraus

gruß bob

Bearbeitet von redknight:

Forensyntax!

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

du bist völlig auf dem Holzweg - ich kann es nicht fassen, was du da gescriptet hast 😀

Das Zerlegen in Zeilen ist unnötig, das macht der sed sowieso. Nimm einfach

sed 's/\ä/ae/g;s/\Ä/Ae/g;s/\ö/oe/g;s/\Ö/Oe/g;s/\ü/ue/g;s/\Ü/Ue/g;s/\ß/ss/g'  eingangsdatei > ergebnisdatei

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Servus,

und noch ein Tipp allgemeiner Natur: Statt „unwahrscheinlichdassnocheinedateisoheißt“ kannst du auch das kleine Progrämmchen „mktemp“ bemühen. Einfach mal dessen Manpage anschauen. ☺

(– edit: @theinlein: Rein interessehalber, gibt es einen bestimmten Grund für’s Escapen der Umlaute?)

Systemkritiker

Anmeldungsdatum:
2. Januar 2011

Beiträge: 110

Wohnort: Schweiz

Anstatt eine Datei mit Verrenkungen über mktemp zu bearbeiten kann er doch gleich von stdin lesen und nach stdout schreiben. Das ist einfacher und allgemeiner.

Das Einlesen und Bearbeiten der Bash überlassen finde ich immer sehr mühsam, da nehme ich sonst immer Awk oder Perl. Trotzdem, hier meine Version mit der Bash:

1
2
3
4
5
6
7
8
9
#!/bin/bash

SEDEXP='s/ä/ae/g;s/Ä/Ae/g;s/ö/oe/g;s/Ö/Oe/g;s/ü/ue/g;s/Ü/Ue/g;s/ß/ss/g'
while IFS= read -r LINE || [[ -n "$LINE" ]]; do
    PART1=${LINE%%#*}
    PART2=${LINE:${#PART1}}
    PART1=$(echo "$PART1" | sed "$SEDEXP")
    echo "$PART1$PART2"
done

Beste Grüsse
Systemkritiker

Systemkritiker

Anmeldungsdatum:
2. Januar 2011

Beiträge: 110

Wohnort: Schweiz

.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi bob,

erstmal willkommen hier auf dem Forum !

Dein Wuselskript ist wohl tatsächlich überflüssig, jedenfalls verstehe ich die Aufgabe, für alle Zeilen so:

  1. ersetze alle Umlaute in allen Zeilen, die nicht mit "#" beginnen

  2. lass den Rest unverändert

(Sollte also in einer Zeile das "#" eingerückt sein oder erst Code vor dem Kommentar stehen, würden hier trotzdem alle Umlaute verändert.)

Diese Aufgabe erledigt eine sed-Zeile alleine:

sed '/^[^#]/ s/\ä/ae/g;s/\Ä/Ae/g;s/\ö/oe/g;s/\Ö/Oe/g;s/\ü/ue/g;s/\Ü/Ue/g;s/\ß/ss/g'  "deineoriginaldatei.txt"  >>  "unwahrscheinlichdassnocheinedateisoheißt.txt"

Die Adresszuordnung bewirkt die Zeilenauswahl.

Oder hast Du da noch andere Nebenbedingungen ?

track

Antworten |