用输入文件列表替换数据库文件中的字符串 - 终端
Replace string in a database file with an input file list - Terminal
当我使用终端匹配来自输入文件的字符串时,我想替换 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 文件
每当我在这两个文件之间找到匹配项时,我想做的就是将该匹配项的数据库文件中的扩展名从 .png 替换为 .jpg。
我希望我已经说清楚了。
我应该将 sed 与正则表达式一起使用吗?像
cat input.txt | while read -r a; do sed -i 's/$a/.jpg/g' wordpress.sql; done
有什么建议吗?即使是正则表达式。
我建议两个步骤:
步骤 1
从 input.txt
创建一个 sed 脚本,其中包含所有替换的列表:
sed -r "s/(([^.]*)\.[^ ]+)[ ]*/s##.jpg#g;/g" input.txt > input.sed
这将创建行 s#png-filename#jpg-filneme#g;
- 有趣的部分
\.[^ ]+)[ ]*
去除了 input.txt 中可能的尾随空格
- 原始行(减去尾随空格)被捕获到
</code> </li>
<li>第一个 <code>.
被捕获到 </code></li> 之后的原始行
<li>替换命令是用 <code>
和 .png
构建的
Step2 将生成的 input.sed
脚本应用到您的 wordpress.sql
文件:
sed -f input.sed wordpress.sql > new_wordpress.sql
取决于您的 input.txt
中的行数,这可能比您的读取循环快也可能不快。因为sed
只有两个咒语(但命令数量要多得多)。
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[[=10=]]; next }
{
for (path in paths) {
gsub(path,gensub(/png$/,"jpg",1,path))
}
print
}
' input.txt wordpress.sql
它有一些与部分匹配相关的注意事项,但并不比您尝试使用 sed 更糟,而且如果出现问题(与 sed 不同)也很容易修复。
当我使用终端匹配来自输入文件的字符串时,我想替换 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 文件
每当我在这两个文件之间找到匹配项时,我想做的就是将该匹配项的数据库文件中的扩展名从 .png 替换为 .jpg。 我希望我已经说清楚了。
我应该将 sed 与正则表达式一起使用吗?像
cat input.txt | while read -r a; do sed -i 's/$a/.jpg/g' wordpress.sql; done
有什么建议吗?即使是正则表达式。
我建议两个步骤:
步骤 1
从 input.txt
创建一个 sed 脚本,其中包含所有替换的列表:
sed -r "s/(([^.]*)\.[^ ]+)[ ]*/s##.jpg#g;/g" input.txt > input.sed
这将创建行 s#png-filename#jpg-filneme#g;
- 有趣的部分
\.[^ ]+)[ ]*
去除了 input.txt 中可能的尾随空格
- 原始行(减去尾随空格)被捕获到
</code> </li> <li>第一个 <code>.
被捕获到</code></li> 之后的原始行 <li>替换命令是用 <code>
和.png
构建的
Step2 将生成的 input.sed
脚本应用到您的 wordpress.sql
文件:
sed -f input.sed wordpress.sql > new_wordpress.sql
取决于您的 input.txt
中的行数,这可能比您的读取循环快也可能不快。因为sed
只有两个咒语(但命令数量要多得多)。
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[[=10=]]; next }
{
for (path in paths) {
gsub(path,gensub(/png$/,"jpg",1,path))
}
print
}
' input.txt wordpress.sql
它有一些与部分匹配相关的注意事项,但并不比您尝试使用 sed 更糟,而且如果出现问题(与 sed 不同)也很容易修复。