我有一个查询,它将使用唯一标识符在数千行(28,000多个更精确)上执行。 这是(简化)查询:
update "table1" set event_type = 'NEW' where id=
还有一个文件ids.txt
,其中包含要对其执行更新的行的ID:
10003
10009
....
....
79345
79356
结果文件应如下所示:
update "table1" set event_type = 'NEW' where id=10003;
update "table1" set event_type = 'NEW' where id=10009;
...
update "table1" set event_type = 'NEW' where id=79356;
其他,而不是使用ids.txt
文件并使用vim使用全局字符串替换形成所有28000个查询,是否有一种简单的方法可以执行此操作?
答案 0 :(得分:4)
使用像sed
这样简单的东西:
sed -r 's/^([0-9]*)$/update "table1" set event_type = \'NEW\' where id=\1/' file
| write back using \1 as placeholder
catch digits in the file
我使用了一种基于bash循环的方法,但它有点过分。请参阅相关问题:Why is using a shell loop to process text considered bad practice?
像这样循环:
while read id
do
echo "update \"table1\" set event_type = 'NEW' where id=${id};"
done < ids.txt
输出:
$ while read id; do echo "update \"table1\" set event_type = 'NEW' where id=${id};"; done < ids
update "table1" set event_type = 'NEW' where id=10003;
update "table1" set event_type = 'NEW' where id=10009;
...
update "table1" set event_type = 'NEW' where id=79345;
update "table1" set event_type = 'NEW' where id=79356;
答案 1 :(得分:4)
在操作文本时,编写shell循环总是错误的方法。
在这种情况下你需要的只是一个简单的sed代码:
$ cat file
10003
10009
$ sed 's/.*/update "table1" set event_type = '\''NEW'\'' where id=&;/' file
update "table1" set event_type = 'NEW' where id=10003;
update "table1" set event_type = 'NEW' where id=10009;
答案 2 :(得分:2)
不是全局字符串替换,但是从vim内部可以使用
:%norm Iupdate "table1" set event_type = 'NEW' where id=<ESC>A;
其中<ESC>
Ctrl + v + esc
答案 3 :(得分:0)
sed -i "s/^/update \"table1\" set event_type = 'NEW' where id=/; s/$/;/" id.txt
-i
进行内联更改(实际上更改了文件id.txt)。
s/^/.../
用......替换每行的开头(^)
s/$/.../
使用...