suchen und ersetzen

L

lutz2

Grünschnabel
hallo,

habe eine textdatei, welche zur weiterverarbeitung verändert werden soll.
es handelt sich um eine gpx datei, die mehrere tracks mit dem selben namen
hat.

<name>track</name>
<trkseg>
<trkpt lat="51.405276500" lon="13.251133700">
<ele>0.000000</ele>
<time>2007-07-01T00:00:00Z</time>
</trkpt>
<trkpt lat="51.405354100" lon="13.252285600">
<ele>0.000000</ele>
<time>2007-07-01T00:00:00Z</time>
</trkpt>
</trkseg>
</trk>
<trk>
<name>track</name>
<trkseg>
<trkpt lat="51.475959500" lon="13.104809300">
<ele>0.000000</ele>
<time>2007-07-01T00:00:00Z</time>
</trkpt>
<trkpt lat="51.479287300" lon="13.109352100">
<ele>0.000000</ele>
<time>2007-07-01T00:00:00Z</time>
</trkpt>
<trkpt lat="51.479094600" lon="13.110714900">
<ele>0.000000</ele>

mit sed bzw. perl ist es mir zwar möglich, alle tracknamen in einen anderen umzuwandeln, aber zur weiterverarbeizung müßten alle tracks einen anderen namen haben zB. 1. tack=track1 , 2. track=track2 usw.

habe nach langer suche in mehreren perl bzw. linuxforen nicht mal eine ansatz gefunden, den ich halbwegs verstehe.

habe auch keine coder erfahrungen!
kann mir jemand helfen?

mfg lutz
 
Code:
perl -i.bak -pe 's/(track)/ ++$x . "." . $1 . "=" . $1 . "$x" /xeg; ' test.txt
 
Zuletzt bearbeitet:
Die Option x beim Ersetzen kannst du weglassen.
Stattdessen würde ich i vorschlagen, falls Track in Großbuchstaben vorkommt.

Code:
perl -i -pe 's/track/${&}.$i++/ieg' inputfile
;)

GNU sed variante
Code:
sed  -i -e "s/track/&_$((x++))/ig" inputfile

Gruß Wolfgang
 
danke smg und wolfgang, :-)

habe ganze nächte um die ohren geschlagen, und dann geht das mit einer zeile.

die perl sachen funktionieren beide auf anhieb, bei sed heißt jetzt jeder track
track_0,
habt mir sehr geholfen, DANKE!!!

mfg lutz
 
Jo sed geht nicht, sorry war ein Denkfehler von mir.

Gruß Wolfgang
 
Zuletzt bearbeitet:
passt schon, :-)

danke für die schnelle hilfe
 
Dafür noch eine Lösung mit reinen Bashmitteln, allerdings nicht als Einzeiler

Code:
x=0;
while read line; 
do 
echo $line|grep "track" >/dev/null &&((x++)); 
a="$(printf %02d $x)";
echo ${line/track/track$a};
done < test  >output
;)
Mit Vornullen zweistellig

Gruß Wolfgang
 
...allerdings nicht als Einzeiler

Code:
x=0; while read line; do echo $line|grep "track" >/dev/null && ((x++)); a="$(printf %02d $x)"; echo ${line/track/track$a}; done < test  >output
...sag sowas nicht (sorry, konnte ich mir jetzt nicht verkneifen) :D :D
 

Ähnliche Themen

CSV Datei mit sed manipulieren/optimieren/ergänzen

Xinerama und ATI Treiber?

IBM T22, Debian Etch 4, X-server start nach Neuinstall

Meine Distri spielt verrückt !

CGI laesst sich nicht ausfuehren

Zurück
Oben