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

时间:2017-12-22 09:34:03

标签: sed replace terminal cat

当我使用终端匹配来自输入文件的字符串时,我想替换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。

2 个答案:

答案 0 :(得分:1)

我建议采取两个步骤:

第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
  • 构建替换命令

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

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

取决于input.txt中可能会或可能不会比您的读取循环更快的行数。因为sed只有两个咒语(但命令数量更多)。

答案 1 :(得分:1)

sed用于单个行上的简单替换,即全部,并且您不应该仅仅为了操作文本而编写shell循环,请参阅http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice

试试这个(使用GNU awk,我假设你使用的是GNU sed):

module inv(clk, in, out);
    input  in;
    input clk;
    output out;
    reg r;
    always @ (posedge clk)
       r <= ~in; 
    assign out=r; 
endmodule

它有一些与部分匹配有关的警告,但没有比你尝试使用sed更容易解决,如果有问题(与sed不同)可以轻松修复。