2012-03-15 28 views
7

Tôi muốn thêm + (dấu cộng) trước tất cả các lần xuất hiện của tên hình ảnh trong một tệp lớn, sử dụng sed.Đặt tên tệp có dấu cộng

Đây là một ví dụ về một dòng:

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 

Đối với dòng này, hình ảnh là /H22.jpg và tôi muốn thay đổi chuỗi này để +/H22.jpg.

Theo như tôi có thể nói, tất cả hình ảnh bắt đầu bằng /, nhưng đó là một tệp lớn, tôi không thể hoàn toàn chắc chắn. Một điều tôi chắc chắn là có một dấu phẩy trước (đó là một dấu phẩy cách nhau .csv tệp). Vì vậy, tôi cần phải thay thế ,[any character except dot][dot](.jpg|.gif|.png) bằng ,+[image_name].extension.

Đây là tốt nhất mà tôi đã làm như vậy cho đến nay:

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

nhưng nó không làm việc.

Trả lời

15

Hãy thử điều này một:

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

Giải thích:

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

Tôi nghĩ rằng bạn rất muốn loại trừ dấu phẩy từ phù hợp trong \ 2 –

+0

tôi đã chỉnh sửa để thêm một dấu phẩy để gốc '\ +' vì nếu không tôi nghĩ rằng nó bỏ qua nhiều lĩnh vực của tập tin 'csv'. Bằng cách này, tìm kiếm sẽ đặt lại trong mỗi lần tìm kiếm. – Birei

2
's/,\([a-zA-Z0-9\/_]\+\)\(\.jpg\|\.png\|\.gif\)/,+\1\2/g' 
  1. Các / mà bạn muốn để phù hợp cần thoát.
  2. Cần có | thoát.

Vì vậy, nhiều lần thoát cần thiết với sed.

1

Điều này có thể làm việc cho bạn: [. ^]

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