2016-03-24 8 views
-1

ich eine Textdatei wie folgt formatiert mit 100k Zeilen haben: von der ersten ZeileErsetzen einer Zeichenkette mit Zählung

something/a/blablaa.jpg 0 
something/a/blablab.jpg 0 
something/b/blablac.jpg 0 
... 
somethingelse/y/blablax.jpg 99 
somethingelse/z/blablay.jpg 99 
somethingelse/z/blablaz.jpg 99 

Ich möchte die Dateinamen mit einer Zählung von 1 Anfahren bis 100000 beginnen zu ersetzen, bis das Letzte. Dies wäre das Ergebnis:

something/a/1.jpg 0 
something/a/2.jpg 0 
something/b/3.jpg 0 
... 
somethingelse/y/99997.jpg 99 
somethingelse/z/99998.jpg 99 
somethingelse/z/100000.jpg 99 

Antwort

2

Diese awk (Gnu awk) Einzeiler arbeitet für Ihren Beispieltext:

awk '{$0=gensub("([^./]+)([.]jpg\\s)", ++i"\\2", "g",$0)}7' file 

mit Ihrem Text:

kent$ awk '{$0=gensub("([^./]+)([.]jpg\\s)", ++i"\\2", "g",$0)}7' f 
something/a/1.jpg 0 
something/a/2.jpg 0 
something/b/3.jpg 0 
somethingelse/y/4.jpg 99 
somethingelse/z/5.jpg 99 
somethingelse/z/6.jpg 99 
1

Lösung mit sed:

grep -n "." file | sed 's/\(.*\):\(.*\/\).*\(\..*\)/\2\1\3/g' 

something/a/1.jpg 0 
something/a/2.jpg 0 
something/b/3.jpg 0 
somethingelse/y/4.jpg 99 
somethingelse/z/5.jpg 99 
somethingelse/z/6.jpg 99 

Eine andere Lösung mit awk:

cat -n file | awk '{gsub("/[^/]*[.]" , "/"$1"." , $2); print $2, $3 }' 

something/a/1.jpg 0 
something/a/2.jpg 0 
something/b/3.jpg 0 
somethingelse/y/4.jpg 99 
somethingelse/z/5.jpg 99 
somethingelse/z/6.jpg 99 

diese Lösungen sind für alle Erweiterungen verfügbar (.jpg ot andere)

+0

Die sed Lösung nur im Moment für einstellige Zeilennummern arbeitet. –

+0

Nicht, [^ /] * stimmen mit einer Anzahl von Zeichen überein, die sich von/ –

+1

unterscheiden Ja, aber ich rede von der Sed-Lösung, die nur eine Ziffer in der ersten Erfassungsgruppe erfasst. –

Verwandte Themen