【问题标题】:how to copy a search selection in VI to the clipboard and paste into same file?如何将VI中的搜索选择复制到剪贴板并粘贴到同一文件中?
【发布时间】:2013-07-07 13:17:38
【问题描述】:

我会给你一个我正在尝试做的例子。假设我有一个包含以下数据的文件:

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 不适用于搜索的文本,仅适用于突出显示的文本。我也尝试使用 yank 并没有成功。是否有捷径可寻?或者也许有更好的方法来完成同样的事情?我的实际文本文件比上面的示例要长得多,因此手动操作并不是一个真正的选择。谢谢!

【问题讨论】:

    标签: regex linux bash vi


    【解决方案1】:

    使用宏会相当容易。

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

    1. 将光标放在第一个A
    2. 输入 C-V 进入块选择模式(如果您在 Windows 上并且将 C-V 映射到粘贴,则输入 C-Q)。
    3. 反复使用 jl 以突出显示要复制的内容上方的块。
    4. y 拉出内容。光标将返回第一行。
    5. $ 跳转到第一行的末尾。
    6. p 粘贴内容。

    【讨论】:

    • 这正是我想要的,谢谢!我的问题是我不知道在字符迭代中使用“j”和“l”来上下移动,从而突出显示该文本块。作为一种解决方法,我尝试使用带有正则表达式字符的搜索来突出显示所需的文本。
    • 向右和向下箭头键可能也可以使用,但 j 和 l 更传统,因为您不必将手从触摸打字位置移开。
    【解决方案2】:

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

    另一种方法是“在线”和通过管道操作目录列表。

    第一

    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。

    【讨论】:

    • 我在末尾添加了“.txt”以附加扩展名,如下所示:ls -1 *PCOUTData.txt | awk '-F_' '{printf("mv %s ./%s\n", $0, $1 ".txt")}' 之后它就像一个魅力并且比我原来的方法快很多,谢谢!
    【解决方案3】:

    这对我有用,在你的具体例子中:

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

    【讨论】:

    • 它可以工作,但是您忘记在其前面的块进行视觉选择。
    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多