我目前正在帮助一位朋友在数据库驱动的网站上重组数百张图片。我已经生成了一个离线的新的重组图像路径列表,并希望用新路径替换数据库的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可能会做到这一点,但一些指针将非常感激。据我所知,只有在没有重复的文件名时,这才能正常工作。
答案 0 :(得分: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