当我使用终端从输入文件匹配字符串时,我想在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
之后的原始阵容直至 - 使用
1
和2.png
构建替换命令
step2 将生成的input.sed
脚本应用于您的wordpress.sql
文件:
sed -f input.sed wordpress.sql > new_wordpress.sql
取决于input.txt
中的行数,这些行可能比您的读取循环更快。因为sed
只有两个咒语(但命令数量越大)。