• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Kombination aus sed und Schleife

Guten morgen zusammen,

habe ja hier schon viel über die Programmiersprache sed gelernt nur bin ich nun mal wieder mit meinem latein am Ende.
Habe mir meinen Text nun schön zusammen geschrieben.

Datei dieht nun so aus:

Pizzeria xy
bahnhofsr. 15
12345
berlin
0,0 km
restaurant xy
westerbachstrasse 125
12345
berlin
0,1 km

Ich möchte nun nach jedem km eine zeile einfügen und ab der ersten von 1 an runterzählen.
Mit sed habe ich auch etwas geschrieben das mir eine zeile einfügt und und ein bestimmten Wert reinschreibt.


Code:
  sed '/km/a\1

Nun möchte ich aber das nach dem ersten gefunden km die 1 steht, dann die 2 usw.
Dachte da an eine kombination aus sed und schleife die km sucht und danach hochzählt. wie könnte man so was realisieren.

Mit einem zähler etwa so, aber das klappt nicht.

Code:
#!/bin/sh                

I=$ (sed '/km/a\1) #möchte km in eine Variable speichern
I=1                   
while test $I -le 10   #schleife auf 10 setzten
do 
              
    I=`expr $I + 1     #immer 1 dazu addieren und mit sed nach dem jeweilige km 
                                  erst 1 dann 2 usw. hinschreiben
done


Aber so klappt das nicht, mist. Hat jemand vielleicht eine bessere Idee oder entdeckt den Fehler.

Gruss FlyingT
 
Hallo noch mal,

hab mir eine neue Schleife gebastelt, die etwas besser funktioniert jedoch nicht richtig. die schleife zählt einmal hoch bis 9 und schreibt dann in jede zeile die 9.
Code:
i=1

while [ $i -lt 10 ]

	do
	sed '/km/a\'$i'' /root/Desktop/restaurantD.txt > /root/Desktop/restaurantE.txt
	i=`expr $i + 1`

done

ich glaube der hat da ein problem mit der variable $i

die Datei sieht jetzt so aus

Pizzeria xy
bahnhofsr. 15
12345
berlin
0,0 km
9
restaurant xy
westerbachstrasse 125
12345
berlin
0,1 km
9

Komisch weil wenn ich die schleife ohne den sed teste springt zählt die richtig hoch.
 
ich glaub eher, dass du zuerst 1 in jede zeile reinschreibst, dann mit 2 überschreibst und so weiter bis 9
machs doch ohne sed
Code:
i=0
while read zeile; do
  if [ ${zeile##* } == 'km' ] ; then
    ((i++))
    ...
  else
    ...
  fi
done <root/Desktop/restaurantD.txt
 
Danke für den Tip.
Das mit dem überschreiben dachte ich auch schon. Jedoch füge ich doch mit sed eine zeile ein nach dem er "km" gefunden hat. ich die diese eingfügte zeile soll jeweils die hochgezählte zahl stehen.

Aber in deiner schleife musst du ihm doch den pfad geben wo er nach km suchen soll.
So wie ich dein skript verstehe suchst du in der zeile nach km und zählst dann i eins hoch.
wie schreibt man dann die hoch gezählte zahl in den text wenn du kein pfad angibst.
er soll ja nach dem ersten km 1 dann 2 usw.
 
Code:
cat <myfile> | 
awk '
/km$/   { print $0 "\n" ++i ; next }
        { print }'

sed sehe ich dafür als ungeeignet an, da es nicht selber Zählen kann.
Als "portabel" und "läuft auf Steinzeit-UNIX" würde ich das o.a. vorschlagen.

Haveaniceday
 
Danke das läuft, ich merke das es noch bessere Werkzeuge als sed gibt, aber als relativer Anfänger ist es leichter sich dort einzuarbeiten.
Aber deine Tips werde ich mir bei herzen halten.

Gruss flyingt
 
Hallo zusammen, ich habe ein ganz komisches Problem. Wie ihr seht habe ich diesen Thread am 7.11.2005 gestartet.

Habe eine Schleife gesucht die nach jedem km, beginnend mit der 1 hochzählt. Die Schleife hat auch wunderbar funktioniert. Nur leider HAT. es funktioniert.Ich habe nichts an meinem Programm geändert aber irgendwie generiert die Schleife keine Zahlen mehr.

Hier mal der Auszug meiner Schleife
Code:
</root/Desktop/restaurantA.txt sed 's/\///g' | sed 's/<a//g' | sed 's/ //g' | sed 's/--//g'| sed -e'/^$/d'  | sed '1,1 i\0' > /root/Desktop/restaurantB.txt


#Schleife zum Hochzählen für die Auswahlzahlen

cat  /root/Desktop/restaurantB.txt |
awk '
	/km$/{ print $0 "\n" ++i ; next }
	{ print }' > /root/Desktop/restaurantA.txt

Vorher wird eine Textdatei mit sed manipuliert und danach soll nach km hochgezählt werden.

So sieht die Datei .../restaurantB.txt



0
China Restaurant China Gar...
Braubachstr. 15
60311
Frankfurt
<span
0,1 km

Dante Eiscafé Pizzeria
Braubachstr. 15
60311
Frankfurt
<span
0,1 km

Fisch - Franke
Domstr. 9
60311
Frankfurt
<span
0,1 km


Und so Datei ../restaurantA.txt (genau gleich)



0
China Restaurant China Gar...
Braubachstr. 15
60311
Frankfurt
<span
0,1 km

Dante Eiscafé Pizzeria
Braubachstr. 15
60311
Frankfurt
<span
0,1 km

Fisch - Franke
Domstr. 9
60311
Frankfurt
<span
0,1 km


Ich denke es liegt nicht am Quellcode, denn es wurde nichts geändert und hatte funktioniert.
Kann mir jemand helfen?

Danke und schönen Gruss
flyingt
 
flyingt schrieb:
Ich denke es liegt nicht am Quellcode, denn es wurde nichts geändert und hatte funktioniert.
Kann mir jemand helfen?


2 Dinge

1. Herzlichen Glückwunsch, Sie sind unser heutiger Tagessieger für den Useless-Use-of-Cat-Award


2. überprüfe Deine Daten und verstehe die Regex
Code:
 /km$/
auf was die matched ;)
 
1. Herzlichen Glückwunsch, Sie sind unser heutiger Tagessieger für den Useless-Use-of-Cat-Award
naja, die vielen sed-Aufrufe könnte man auch ein wenig zusammenfassen.

Aber zum Wesentlichen: TeXpert meint wahrscheinlich, dass zwischen "km" (für Kilometer) und $ (= Zeilenende) vielleicht noch ein paar andere Zeichen kommen (z.B. Leerzeichen). Und damit würde deine Regular Expression nicht mehr treffen.
 
Danke für die Hilfe, notoxp

Habe eine alternativ lösung eingesetzt. bleibt mir jedoch ein Rätsel der Fehler im Programm. Wie gesagt es lief einwand frei, habe es nach einem monat nun wieder gestartet und dann der fehler ???

wünsche einen schönen Tag
 
Oben