当我使用终端匹配输入文件中的字符串时,我想替换SQL文件中的某些文件扩展名。
我有一个包含文件路径列表的input.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文件
每当我在2个文件中找到匹配项时,我想要做的是将匹配的数据库文件中的扩展名从.png替换为.jpg。我希望我已经说清楚了。
我应该用正则表达式使用sed吗?就像是
cat input.txt | while read -r a; do sed -i 's/$a/.jpg/g' wordpress.sql; done
有什么建议?即使是RegEx。
sed用于单个行上的简单替换,就是全部,并且你不应该仅仅为了操作文本而编写shell循环,请参阅http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice。
试试这个(使用GNU awk,我假设你使用的是GNU sed):
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;
\.[^ ]+)[ ]*
在input.txt中删除可能的尾随空格\1
.
被捕获到\2
之后的原始线\1
和\2.png
构建的步骤2将生成的input.sed
脚本应用于wordpress.sql
文件:
sed -f input.sed wordpress.sql > new_wordpress.sql
取决于input.txt
中可能会或可能不会比读取循环更快的行数。因为只有两个sed
的咒语(但有更多的命令)。