用输入文件列表 - 终端替换数据库文件中的字符串



当我使用终端从输入文件匹配字符串时,我想在SQL文件中替换一些文件扩展名。

我有一个输入.txt包含文件路径列表。

/2014/02/haru-sushi_copertina_apdesign-300x300.png 
/2014/02/haru-sushi_copertina_apdesign.png 
/2014/02/harusushi_01_apdesign-300x208.png
ect ect

然后我有一个wordpress.sql文件

我想做的是,每当我找到两个文件之间的匹配时,都将在该匹配的数据库文件中替换从.png到.jpg的扩展名。我希望我已经清楚自己。

我应该使用带有正则表达式的sed吗?像

cat input.txt | while read -r a; do sed -i 's/$a/.jpg/g' wordpress.sql; done 

有什么建议吗?即使是正则罚款。

sed用于单个线路上的简单替换,这就是全部,您绝对不应仅编写外壳循环来操纵文本,请参阅http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-shell-loop-to-to-tox-text-text-tyxtybad-ractice。

尝试这个(使用GNU尴尬,我认为您自从使用GNU以来就拥有了):

awk -i inplace 'NR==FNR { paths[$0]; next }
{
    for (path in paths) {
        gsub(path,gensub(/png$/,"jpg",1,path))
    }
    print
}
' input.txt wordpress.sql

它有一些与部分匹配有关的警告,但没有比您试图使用SED且易于解决的问题(与SED不同)。

我建议两个步骤:

步骤1 input.txt创建一个SED脚本,其中包含所有替换的列表:

sed -r "s/(([^.]*).[^ ]+)[ ]*/s#1#2.jpg#g;/g" input.txt > input.sed

这将创建线路s#png-filename#jpg-filneme#g;

  • 有趣的零件.[^ ]+)[ ]*条带有您的输入中可能的落后空间
  • 原始线(减去尾巴)被捕获到1
  • 将第一个.捕获到2
  • 之后的原始阵容直至
  • 使用12.png
  • 构建替换命令

step2 将生成的input.sed脚本应用于您的wordpress.sql文件:

sed -f input.sed wordpress.sql > new_wordpress.sql

取决于input.txt中的行数,这些行可能比您的读取循环更快。因为sed只有两个咒语(但命令数量越大)。

最新更新