2012-03-15 12 views
7

Quiero agregar un + (signo más) antes de todas las apariciones de nombres de imagen en un archivo enorme, usando sed.Anteponer nombres de archivo con el signo más

Este es un ejemplo de una línea:

DAUSSI-H22-14K White Gold-Princess-1.00ct-G-SI1orH-VS2-EGL-mm-3.5,,H22,,7050,5720,3/5/2012 7:34,,,1,,henri-daussi-h22-diamond-halo-engagement-ring-14k-white-gold-width--mm-style-princess-1-00ct-g-si1-or-h-vs2-egl-size-3-5,henri-daussi-h22-diamond-halo-engagement-ring-14k-white-gold-width--mm-style-princess-1-00ct-g-si1-or-h-vs2-egl-size-3-5.html,Henri Daussi H22 Diamond Halo Engagement Ring-14K White Gold-Style:Princess-1.00ct-G-SI1 or H-VS2-EGL-Width: mm-Size:3.5,"Henri Daussi engagement ring with hand-matched side diamonds in a beautiful halo setting, totaling 1.40 carats. The image at left displays this ring with a 1.00 carat princess cut diamond. This setting can accommodate a variety of shapes and sizes. Please contact us on the range of possibilities of any ring.","Henri Daussi engagement ring with hand-matched side diamonds in a beautiful halo setting, totaling 1.40 carats. The image at left displays this ring with a 1.00 carat princess cut diamond. This setting can accommodate a variety of shapes and sizes. Please contact us on the range of possibilities of any ring.",,,,,14K White Gold,Princess-1.00ct-G-SI1 or H-VS2-EGL,,3.5,Metal_Style_Width_Size,simple,/H22.jpg,Shown with a 1.00 carat princess cut diamond.,/H_22.jpg,Shown with a 1.00 carat princess cut diamond.,/H22.jpg,Shown with a 1.00 carat princess cut diamond.,,,,,,Enabled,Taxable Goods,Not Visible Individually,0,0,No,Engagement Rings/Henri Daussi;;Designers/Henri Daussi,No,"ROUND, PEAR SHAPE, EMERALD CUT, MARQUISE, OVAL, RADIANT, PRINCESS CUT, HEART SHAPE, CUSHION CUT, ASSCHER CUT",.45-6.00 Carat,/H22.jpg 

Para esta línea, la imagen es /H22.jpg y quiero que este cambio de cadena a +/H22.jpg.

Por lo que puedo decir, todas las imágenes comienzan con /, pero es un archivo enorme, no puedo estar totalmente seguro. Una cosa de la que estoy seguro es que hay una coma antes (es un archivo separado por comas .csv). Entonces necesito sustituir ,[any character except dot][dot](.jpg|.gif|.png) con ,+[image_name].extension.

Este es el mejor que he hecho hasta ahora:

sed -ie 's/,\([a-zA-Z0-9/_]\+\)\(\.jpg|\.png|\.gif\)/,+\1\2/g' file.csv 

pero no está funcionando.

Respuesta

15

prueba este:

sed 's#\(,\)\([^.,]\+\.\(jpg\|png\|gif\)\)#\1+\2#g' infile 

Explicación:

s#...#...#g    # Substitute command. '#' is separator and 'g' is to apply it many times for 
         # each line. 
\(,\)     # Match a comma, and save it as '\1' 
[^.,]\+\.    # Match any characters until a '.' or ',' found. 
\(jpg\|png\|gif\)  # Match extension. 
\1+\2     # Replace with: Comma, plus sign and the image name. 
+0

creo que mucho desea excluir de la casación en coma \ 2 –

+0

He editado para añadir una coma para originales '\ +' porque de lo contrario, creo que omite muchos campos del archivo 'csv'. De esta manera, la búsqueda se restablecerá en cada uno. – Birei

2
's/,\([a-zA-Z0-9\/_]\+\)\(\.jpg\|\.png\|\.gif\)/,+\1\2/g' 
  1. El / que desea hacer coincidir necesario escapar.
  2. El | necesitaba escapar.

Se necesitan tantos escapes con sed.

1

Esto podría funcionar para usted: [. ^]

sed 's/\(^\|,\)\([^,.]*\.\(jpg\|png\|gif\)\)\>/\1+\2/g' file 
Cuestiones relacionadas