如何将VI中的搜索选择复制到剪贴板并粘贴到同一个文件中?

时间:2013-07-09 19:30:58

标签: regex linux bash vi

我将举例说明我正在尝试做的事情。假设我有一个包含以下数据的文件:

mv AB12350_PCOUTData.txt ./
mv AB12351_PCOUTData.txt ./
mv AB12352_PCOUTData.txt ./
mv AB12353_PCOUTData.txt ./
mv AB12360_PCOUTData.txt ./
mv AB12374_PCOUTData.txt ./

我正在尝试复制“AB123xx”部分并粘贴到最后以获得以下内容:

mv AB12350_PCOUTData.txt ./AB12350

之后我将附加一个“.txt”来缩短文件名。我的想法是,我可以使用带有正则表达式字符的搜索功能来突出显示所需的文本,如下所示:

/AB123[567][01234]  

然后我可以简单地将其复制到剪贴板并将其粘贴到每行的末尾并附加“.txt”。显然Shift + Ctrl + C不适用于搜索文本,只适用于突出显示的文本。我也试过使用猛拉而没有成功。是否有捷径可寻?或者也许是一种更好的方法来完成同样的事情?我的实际文本文件比上面的例子长得多,所以手工操作并不是一个真正的选择。谢谢!

3 个答案:

答案 0 :(得分:1)

我假设您可以访问文件所在的目录 并且您只想对它们进行批处理操作,并假设您的解决方案是将目录列表保存到文件并将“mv”附加到行前面的结果。

另一种方法是操纵dir列表'in-line'和thru pipe。

第一

ls -1 *PCOUTData.txt | awk '-F_' '{printf("mv %s ./%s\n", $0, $1)}'
mv AB12350_PCOUTData.txt ./AB12350
mv AB12351_PCOUTData.txt ./AB12351

当你确定它按你想要的方式工作时,重定向到你最喜欢的shell,即

ls -1 *PCOUTData.txt | awk '-F_' '{printf("mv %s ./%s\n", $0, $1)}' | ksh

如果您的文件名包含空格,则必须阅读find -print0 -prune作为清理的前端名称生成器。

IHTH。

答案 1 :(得分:1)

使用宏可以很容易。

但是,在这种特殊情况下,您可以使用块可视模式复制和粘贴内容(假设您实际上已经获得了vim而不仅仅是普通的vi):

  1. 将光标放在第一个A
  2. 键入C-V以进入块选择模式(如果您使用的是C-Q并且C-V映射为粘贴,则键入{{1}}。
  3. 重复使用 j l 突出显示要复制的内容的块。
  4. y 来抽取内容。光标将返回第一行。
  5. $ 跳转到第一行的末尾。
  6. p 粘贴内容。

答案 2 :(得分:0)

根据您的具体示例,这对我有用:

:'<,'>s/\(.*\(AB\d\+\)_.*\)/\1\2/