【问题标题】:Deleting / changing searched text in Vim在 Vim 中删除/更改搜索到的文本
【发布时间】:2010-10-21 04:15:26
【问题描述】:

当我对某个模式进行交互式搜索时,每次点击n,我都会得到下一个结果。如何删除/更改我得到的每个结果?

理想情况下,我正在寻找的内容是这样的:我点击n 以获取搜索结果,然后点击magic command 在可视模式下突出显示该结果,然后我可以执行@987654324 @ 或 c 删除或更改突出显示的文本。

示例

我输入命令

/hello .

它匹配hello、一个空格和它后面的任何字符。

所以说它到达的第一个匹配是“hello w”。

现在,我想删除所有hello w,搜索下一个匹配项(假设是hello a),将下一个匹配项更改为hello there,并对每个匹配项继续执行不同的操作。

我不只是在寻找搜索和替换,因为我希望能够以交互方式对每个结果执行 any 操作,例如删除第一个结果,将第二个结果替换为bye,并将第三个结果替换为later

【问题讨论】:

  • @shoebox639:这将用hello w 替换所有hello,这不是我想要的:/

标签: search vim keyboard-shortcuts replace


【解决方案1】:

要选择当前比赛的整个比赛(如果你在比赛的开始),你可以输入

v//e

删除到匹配结束

d//e

改变匹配

c//e

唯一的缺点是你不能使用n(因为那会重做//e)而必须使用//

所以典型的工作流程应该是这样的

/hello ./    : Jump to the start of the next "hello ."
d//e         : Delete the item
//           : repeat the search to get to the begining of the next "hello ."
c//e         : change it
//           : next one.
etc.

【讨论】:

  • 啊,这正是我要找的!惊人的!澄清一下,//e 究竟搜索什么?比赛结束?它是如何工作的?
  • 一个更普遍的问题,其实是,// 搜索什么?
  • 其实我已经单独问过了,请在这里回答:stackoverflow.com/questions/3984622/…
【解决方案2】:

我想你想要gn:(转到下一场比赛并)在可视模式下选择它。您可以在此前面加上一个命令,例如cgn 更改匹配,dgn 删除等。我发现如果已经在匹配上,则使用此匹配,所以应该这样做。

【讨论】:

  • 这应该是答案,实用多了!
  • 这看起来很棒。什么版本的vim支持这个?我在我的版本的帮助中找不到它,并且该命令对我不起作用(我在 7.2 上)。
  • 在另一台机器上,我已经验证它可以在 vim 8.0 上运行 - 所以较新的 vim 似乎没问题。
【解决方案3】:

对于删除所有包含字符串的行,您可以使用:

:g@search_query@d

g 命令全局搜索

@ 分隔符

d 命令删除。

【讨论】:

    【解决方案4】:

    您正在寻找“确认”

    :%s/hello .//gc
    

    : 进入 ex 模式, % 应用于整个缓冲区, s 替换, /hello ./ 搜索该正则表达式, // 将其替换为空, g 查找一行中的所有匹配项,和 c 在每次匹配之前确认是否删除。

    假设您正在寻找确认。如果你只想一次完成,已经提到过很多次了

    :%s/hello .//g
    

    :进入 ex 模式,% 应用于整个缓冲区,s 替换,/hello ./ 搜索该正则表达式,// 将其替换为空,g 查找一行中的所有匹配项

    【讨论】:

    • 我知道确认,但我正在寻找一些不同的东西。请查看问题中的新粗体文本以进行澄清。
    • 您所描述的是确认。您输入 top 命令,它会将您带到第一个结果并询问您是否要替换。你说“y”或“n”,要么做,要么不做,然后移动到下一个实例,问同样的问题
    【解决方案5】:

    用录音来做这件事怎么样?

    qa/textsearch ENTERv9lvq

    9 是(textsearch - 1 的长度),即 10 - 1 = 9

    现在,一旦您准备好寄存器 a 中的录音,请执行 @agv@a:执行名为 a 的记录,gv 选择您的搜索文本。)

    现在您可以对所选文本进行任何操作,完成后您可以转到下一个 一个带有 @@

    【讨论】:

      【解决方案6】:

      我会按照前一张海报的建议做:用 d target 构造一个删除命令并点击 。在使用 n 查找每个事件之后。在这种情况下,7x 将删除任何匹配 hello . 的内容这是d7ld7[space] 的快捷形式,因为 d 接受任何移动命令。

      但是,如果您想要一个真正通用的解决方案来搜索和删除正则表达式,您可以执行单个替换命令(即使它失败),然后执行您的搜索并使用 & 将最后一个替换重新应用到当前行:

      :s/hello .//
      /hello .
      &
      n
      &
      

      第一行(替换)可能会失败。您仍然可以使用 & 稍后再次应用它。我有点惊讶第一个替换命令没有设置默认模式,但也许它在 vi 以外的 vi 中设置。

      【讨论】:

      • 感谢您的回答!有什么方法可以让 Vim 在可视模式下突出显示每个匹配项,以便我可以对可视选择的文本进行操作?那将是最佳解决方案。
      • 您可以通过开启 hlsearch (:set hlsearch) 随时隐藏当前搜索模式
      • 我的意思是在可视模式下突出显示它,这样我就可以对其执行操作。
      【解决方案7】:

      使用cwfooesc 或其他方式更改第一个,然后使用. 命令对您要更改的每个进一步的匹配项重复该编辑。

      【讨论】:

      • 这改变了 word,OP 想要删除/替换 text
      • 好的,所以使用任何你需要的text编辑命令来改变你需要改变的东西。如果没有具体的例子,就不可能推荐具体的东西。
      【解决方案8】:

      按 x 键。

      或用户搜索替换:[esc] :%s/[search-regex]/[replace-regex]/g

      如果replace-regex 为空,您将删除刚刚搜索的内容。

      【讨论】:

      • 如果你想替换文本,只需执行 [r] 并键入,然后 [esc][n][r] 再键入更多。但搜索和替换可能最适合您。
      • x 不是只删除一个字符吗?而r 只替换一个字符?我正在寻找删除或替换整个匹配的文本。
      猜你喜欢
      • 2012-01-25
      • 2015-02-06
      • 1970-01-01
      • 2012-01-18
      • 2019-09-13
      • 1970-01-01
      • 2016-01-21
      • 2020-03-11
      • 1970-01-01
      相关资源
      最近更新 更多