如何将文本追加到Gvim或vi中的行尾

时间:2011-11-17 17:58:16

标签: unix vim text vi

我在Windows上使用gvim并且有一个文件包含几行看起来像这样的

Select '305','TableA
Select '313','TableB
Select '313','TableC

我想在每行的末尾添加以下行。

', count(*) from [Tablename] where msgid in (select msgid from mainTable where row_dtm<'17NOV11')

结果看起来像这样(注意[TableName]被实际的表名替换。

Select '305','TableA', count(*) from TableA where msgid in (select msgid from mainTable where row_dtm<'17NOV11')
Select '313','TableB', count(*) from TableB where msgid in (select msgid from mainTable where row_dtm<'17NOV11')
Select '313','TableC', count(*) from TableC where msgid in (select msgid from mainTable where row_dtm<'17NOV11')

我可以添加附加文本,只需执行

即可
%s/$/', count(*) from [Tablename] where msgid in (select msgid from mainTable where row_dtm<'17NOV11')/g

但我仍然坚持如何阅读表名并将其替换为[Tablename]。

基本上我只想尝试生成几个查询。有任何想法吗? 我知道表名将始终是从行尾到第一个'字符的文本,但我如何阅读它并将其添加到修改后的字符串?

由于

3 个答案:

答案 0 :(得分:10)

你需要做一点反向参考 将搜索字词更改为:
\(\a\+\)$这将与表名匹配。使用\(\)围绕搜索字词,可以在替换中引用它 将“1”添加到替换字符串中,只要您希望显示表名即可 结果应如下所示 %s/\(\a\+\)$/\1', count(*) from [\1] where msgid in (select msgid from mainTable where row_dtm<'17NOV11')/g

答案 1 :(得分:4)

如果您选择一个块(使用 CTRL + V (如果您在Windows中,可能会给您带来麻烦),您可以将文本追加到所有行中块使用 A

例如,假设我选择了以下 粗体斜体 中的代码:


    Lorem ipsum dolor sit amet, consectetur adipisicing elit, 
    sed do eiusmod tempor incididunt ut labore et dolore magna
    aliqua. Ut enim ad minim veniam, quis nostrud exercitation 
    ullamco laboris nisi ut aliquip ex ea commodo consequat. 
    Duis aute irure dolor in reprehenderit in voluptate velit 
    esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
    occaecat cupidatat non proident, sunt in culpa qui officia
    deserunt mollit anim id est laborum.

现在我输入 A 和文本bla后跟 ESC

结果是:


    Lorem ipsum dolor sit amet, coblansectetur adipisicing elit, 
    sed do eiusmod tempor incididublant ut labore et dolore magna
    aliqua. Ut enim ad minim veniablam, quis nostrud exercitation 
    ullamco laboris nisi ut aliquiblap ex ea commodo consequat. 
    Duis aute irure dolor in repreblahenderit in voluptate velit 
    esse cillum dolore eu fugiat nblaulla pariatur. Excepteur sint
    occaecat cupidatat non proidenblat, sunt in culpa qui officia
    deserunt mollit anim id est lablaborum.

同样,如果您键入 I 而不是 A ,则会预先添加文本。

答案 2 :(得分:2)

您始终可以录制宏修改行并移动到下一行,然后重播该宏:

qq$bywA', count(count(*) from <ESC>pAwhere msgid in (select msgid from mainTable where row_dtm<'17NOV11')<ESC>jq2@q
  • qq→开始在注册q中记录一个宏。
  • $→转到行尾。
  • b→返回上一个单词的开头。
  • yw→猛拉词。
  • Afoo<ESC>→在行尾添加“foo”,使用<ESC>键结束插入模式。
  • p→粘贴一句话。
  • Afoo<ESC>→在行尾添加“foo”,使用<ESC>键结束插入模式。
  • j→转到下一行。
  • q→结束微距录制。
  • 2@q→重播注册q中的宏2次。