-
Problem in Shell-Skript, mit sed wahrscheinlich
Hallo
Ich habe ein Problem mit meinen Skript.
Ich möchte von einer großen Datei(list1) in bestimmten Zeilen das Zeichen _ durch einen . ersetzten und in der Datei list2 ausgeben lassen.
In welchen Zeilen dies geschehen soll habe ich in der Datei zz.
Von Zeit zu Zeit funktioniert dieses Skript, ein anderes Mal hingegen gibt es einfach eine leere Datei aus. Ich weiß deshalb nicht was genau los ist.
Vielleicht könntet ihr es euch mal anschauen?
Der Inhalt der Datei zz sind nur diese Zeilenangaben
--------------zz------------------------
214
334
337
361
-------------zz--------------------------
Mein Bash-Skript sieht nun wie folgt aus.
---------------------02.make---------------
#!/usr/local/bin/bash
#Um die ursprünliche zu sichern
/bin/cp list1 list2
#Ende der While-Schleife
end=$(nl zz | tail -n 1 | awk '{print $1}')
e=0
while [ $e -lt $end ]; do
e=$[$e+1]
a=$(sed -n $e'p' zz)
sed $a\s/_/./g list2 | tee list2
done
--------------------02.make----------------
Hat jemand eine Idee, was falsch ist oder wie ich dies komplett mit sed realiserien könnte
Ruga
-
sed s/\_/\./g list1 > list2
sollte es tun ... oder mit
tr
-
Wie gebe ich die Zeile an?
Danke für die Antwort
Aber wie gebe ich bei deinen die Zeile an in der es ersetzt werden soll?
Ich will ja nicht in jeder den _ durch einen . ersetzen.
Ruga
-
axo
dann musst du eine extra "sedscript datei schreiben"
30,50/{
s/\_/\./g
}
samit werden nur die _ durch . in den zeilen 30-50 ersetzt
es geht natürlich auch mit regex
/regex/,/regexdie2./{
s/\_/\./g
}
-
Hilft mir nicht weiter
Hallo
Es kann sein dass ich einfach zu dumm bin
aber mit den ersten Vortschlag kann ich nichts anfangen, da ich wie schon erwähnt nur in bestimmten einzelnen Zeilen (die in einer Datei angeben sind) etwas ändern will.
und mit dem zweiten weiß ich auch nicht wie ich das machen könnte
Ruga
-
sorry ... vieleicht hab ich mich etwas zu kur6z gefasst
also du erzeugst eine datei z.b sedscript
da schreibst du rein
30,50{
s/\_/\./g
}
die 1. (30) zahl steht für die erste zeile ab der du bearbeiten willst
die 2. (50) zahl steht für die letzte zeile bis der du bearbeiten willst (kann weggelassen werden (dann ersetzt er nur die 30. zeile)
{ begin des kommandos das für zeilen 30 bis 50 ausgeführt werden soll
s = ersetzen
g = ersetzen von allen vorkommen (ohne g wird nur das erste _ durch ein . ersetzt)
}ende
zwischen { und }
kannst du natürlich noch mehr kommandos schreiben
ich hoffe das hilft dir weiter
mit sed kannst du natülich noch mehr machen - hier ne kleine auswahl
http://www.student.northpark.edu/pem...d/sed1line.txt
-
Hab schon verstanden
Was dein ersten Vorschlag bedeutet habe ich schon verstanden. ich will aber keine Bereiche ersetzen, sondern nur einzelne Zeichen in Zeilen.
Das hatte ich mit meinen Skript auch schon.
Mein Problem ist nur dass es ab und zu funktioniert, ein anderes Mal allerdings eine leere Seite ausgibt.
Ruga
-
axo ....
sed $a\s/_/./g list2 | tee list2
ich denke mal das es daran liegt.
du liest di list2 aus und überschreibst sie gleichzeitig
sed $a\s/_/./g list1 | tee list2
solltes besser klappen von list1 lesen und nach list2 schreiben
(dann kannst du dir auch copy sparen)
#!/usr/local/bin/bash
for i in $(cat zz)
do
sed $i\s/_/./g list1 | tee list2
done
sollte auch klappen da der for befehl immer nur ein wort liest
-
Funktioniert
Jetzt funktioniert es
Wahrscheinlich lag es am gleichzeitigen lesen und schreiben der Datei
mit
end=$(nl zz | tail -n 1 | awk '{print $1}')
e=0
while [ $e -lt $end ]; do
e=$[$e+1]
a=$(sed -n $e'p' zz)
sed $a\s/_/./g list1 | tee list2
cp list2 list1
done
funktioniert es jetzt
Ich verwende allerdings jetzt lieber deine for-Schleife weil die um einiges eleganter wirkt.
Allerdings kann man sich das cp nach sed nicht sparen, da sonst jedes mal von der gleichen und nicht von der Ersetzten gelesen würde.
Nochmals danke für die Hilfe
Ruga
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen