将文本附加到文件中的多行中的每一行

时间:2013-11-21 14:09:20

标签: linux bash vim awk

我有一个查询,它将使用唯一标识符在数千行(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个查询,是否有一种简单的方法可以执行此操作?

4 个答案:

答案 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/$/.../使用...

对每行($)的结尾进行分配