0

我目前正在帮助一位朋友在一个数据库驱动的网站上重新组织数百张图像。我已经离线生成了一个新的、重组的图像路径列表,并希望用新路径替换数据库的 sql 导出中的每个匹配图像引用。

编辑:这是我想要实现的一个例子

new_paths_list.txt是我在将所有现有图像组织到文件夹后使用批处理脚本生成的文件在此之前,所有图像都在几个文件夹中。此生成列表的示例可能是:

image/data/product_photos/telephones/snom/snom_xyz.jpg
image/data/product_photos/telephones/gigaset/giga_xyz.jpg

my_exported_db.sql (从网站导出的数据库)的示例可能是:

...

,(110,32,'data/phones/snom_xyz.jpg',3),(213,50,'data/telephones/giga_xyz.jpg',0),

...

我想要的结果是my_exported_db.sql是:

...

,(110,32,'data/product_photos/telephones/snom/snom_xyz.jpg',3),(213,50,'data/product_photos/telephones/gigaset/giga_xyz.jpg',0),

...

一些伪代码来说明:

1/ 在 my_exported_db.sql 中找到第一个图像名称,例如 'snom_xyz.jpg'。

2/ 在 new_paths_list.txt 中找到相同的图像名称

3/ 如果存在,复制整行(路径和文件名)

4/ 将此图像的 my_exported_db.sql 中的整个路径替换为复制的行

5/ 对 my_exported_db.sql 中的所有其他图像名称重复

似乎与图像名称匹配的正则表达式是:

([^)''"/])+\.(?:jpg|jpeg|gif|png)

和一个匹配图像名称,完整的路径(相对或绝对)是:

\bdata[^)''"\s]+\.(?:jpg|jpeg|gif|png)

我环顾四周,发现 Sed 或 Awk 可能能够做到这一点,但一些指针将不胜感激。我知道这只有在没有重复文件名的情况下才能正常工作。

4

1 回答 1

0

您可以使用 sed 转换new_paths_list.txt为一组 sed 替换命令:

sed 's|\(.*\(/[^/]*$\)\)|s#data\2#\1#|' new_paths_list.txt > rules.sed

该文件rules.sed将如下所示:

s#data/snom_xyz.jpg#image/data/product_photos/telephones/snom/snom_xyz.jpg#
s#data/giga_xyz.jpg#image/data/product_photos/telephones/gigaset/giga_xyz.jpg#

然后再次使用 sed 进行翻译my_exported_db.sql

sed -i -f rules.sed my_exported_db.sql

我认为在某些 shell 中,可以将这些步骤结合起来而无需rules.sed

sed 's|\(.*\(/[^/]*$\)\)|s#data\2#\1#|' new_paths_list.txt | sed -i -f - my_exported_db.sql

但我不确定。

编辑<:

如果图像位于 下的多个目录中data/,请进行以下更改:

sed "s|image/\(.*\(/[^/]*$\)\)|s#[^']*\2#\1#|" new_paths_list.txt > rules.sed
于 2013-09-06T16:32:40.500 回答