我有一个包含此内容的文件
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_customer\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_order\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_to_cart\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_to_wish_list\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_transaction\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE clear_cart\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE get_order_contents\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE get_shopping_cart_contents\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE get_wish_list_contents\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE receipt_retrieve\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE remove_from_cart\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE remove_from_wish_list\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE select_categories\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE select_products\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE select_sale_items\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE update_cart\G'
mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE update_wish_list\G'
我想使用函数执行每一行并替换为命令输出,然后搜索以“mysql”开头的下一行并执行该行..直到文件结尾。
这是我的功能
r !mysql -uroot -ppass sas -e 'SELECT name FROM mysql.proc;'
normal! gg /name<CR>n
normal! dd
%normal! I mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE
normal! ggdd0
%normal A\G'
normal! gg0
normal! G
let lastline = line(".")
echom lastline
normal! gg0
"here is where i want to start
.!sh
**"back to normal to search**
normal! /mysql<CR> n
**"when found execute the line**
%normal !!sh
".!sh
endfunction
这适用于第一行,但我无法弄清楚如何做整行范围。我知道我很接近..
答案 0 :(得分:2)
我不确定你是否真的需要它的功能。
方式1
你能做到:
:%!sh
执行整个缓冲区一次?
方式2
例如,如果缓冲区中的某些行没有以mysql
开头,并且您不想执行它们,则可以执行以下操作:
:g/^mysql/.!sh
方式3
如果你真的想逐一进行,就像你在问题中所描述的那样,执行并移动到下一个mysql
,执行,你可以用宏来做:
/^mysql<cr> "search the pattern
gg "cursor back to top
qq "start recording to q
!!sh<cr> "run first line as shell command, take output back
n "next command line (with pattern)
q "stop recording
然后
500@q
如果要执行500行。