将两个正则表达式的匹配替换为两个文件中的匹配

时间:2013-09-06 11:04:11

标签: sed awk pattern-matching image-replacement

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

1 个答案:

答案 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