【问题标题】:vim search and replace a variable stringvim 搜索并替换一个变量字符串
【发布时间】:2014-06-16 05:52:05
【问题描述】:

我有一个这样的模式。

func(a, "a");
func(b, "b");
func(abc, "abc");
...

我希望将它们替换为

func(a);
func(b);
func(abc);
...

在vim中,我该怎么做?

【问题讨论】:

  • 这是非常基本的(并且这里已经询问了它的变体数万亿次),您应该已经弄清楚了,例如遵循无尽的 vi / Vim 教程之一,或 :h :substitute。
  • @IngoKarkat 我试图弄清楚并尝试更改正则表达式以满足我的需要。但我对正则表达式完全陌生,无法成功。我仍然不明白我接受的解决方案。我会看看他们并理解。很抱歉问了一个基本的问题。
  • 下一次,请发表你的尝试;这可以解决您的误解。这是一组关于 Vim 正则表达式的精彩截屏视频:vimcasts.org/categories/regular-expressions

标签: regex vim replace


【解决方案1】:

这可能有效,但在我们看到更多输入之前无法确定:

%s/\v(.*), .*(\);)/\1\2/

试试这个替代:

:%s/, ".\{-}"//

解释:

% - 在整个文件上运行

, " - 将逗号匹配到第一个引号

.\{-}" - 匹配零个或多个字符,尽可能少直到"

// - 将匹配的模式替换为空。

【讨论】:

  • 工作顺利。谢谢你。在我接受答案之前,请给我一点时间。如果您能简短地解释一下,也将不胜感激。 :)
  • 添加了一些解释,希望对您有所帮助。
  • 这是不可接受的,因为我的巨大源文件中有其他行,其中存在“模式。它到处都替换
  • @Manty - 如果您显示更多文件会更好。
【解决方案2】:

如果您想要对行进行大规模编辑,可以使用正则表达式来完成。请按以下步骤操作:

  1. 将光标置于顶行。
  2. Shift-V 开始视觉选择。
  3. 将光标移动到最后一行以选择要修改的所有行。
  4. 键入“:”,您会看到“:'”出现在底部。
  5. 键入“s/,”.*");/);/”并按回车键。线条会改变。

在#5 上,它是一个正则表达式搜索和替换。 “s”表示操作,然后是匹配模式,然后是替换它的内容。全部由它们之间的 / 键和末尾的一个键分隔。

如果您想了解更多信息,可以在这里找到一些信息:http://vimregex.com/

【讨论】:

  • 我的巨大源文件中还有其他行,其中存在“模式。它正在到处替换
【解决方案3】:

应该这样做。

:%s/func(\([^,]*\),\s*"\1"/func(\1/g

【讨论】:

  • 嗨,这很好用。但如果 func() 有三个参数,则不起作用。
  • @Manty 你能在你的帖子中添加一些例子吗?
  • 当您发布问题时,请发布所有用例。不要指望我们猜测您拥有什么样的数据。完整的问题将产生完整的答案。
  • @JS웃 我同意。我的错。道歉。
  • @RSahu 问题是当字符串有 时,实际上没有 3 个参数。 EX:乐趣(a,“abc”);我的代码中很少有这样的地方。所以我可以手动编辑它们。没有问题。谢谢你。一会儿我会接受答案。
【解决方案4】:

如果您像我一样试图弄清楚如何在保留一些子字符串的同时进行搜索和替换,您可以使用 捕获组

R Sahu 的solution 使用捕获组,但由于我不知道它们叫什么,所以无法查找。

这里是另一个捕获组的例子:

public User updateUser(String username, Optional<String> newUsername, Optional<String> newPassword, Optional<String[]> newRoles) {
// :s/\vOptional\<([a-zA-Z\[\]]*)\>/\1/g
public User updateUser(String username, String newUsername, String newPassword, String[] newRoles) 

搜索定义

:s只搜索一行

搜索字符串

\v 假定除字母、数字和下划线以外的任何字符都是特殊字符(“非常神奇”模式)

Optional\&lt; 匹配文字短语'可选

([a-zA-Z\[\]]*) 捕获字母和 [ ​​] 的组合以供以后使用

\&gt; 匹配文字短语'>'

替换字符串

\1插入第一个捕获的组

全球标志

g 替换每个找到的实例,而不仅仅是第一个

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2022-08-17
    • 2019-03-28
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多