【问题标题】:Replace Text Between 2 Characters in Vim在 Vim 中替换两个字符之间的文本
【发布时间】:2013-08-07 10:59:23
【问题描述】:

我正在编写旧代码,其中有如下语句:

int array[MAX_SIZE_FOR_THIS_ARRAY];

在 VIM 中,我想用 ARRAY 替换 [ & ] 之间的文本(包括 [ & ]),如下所示:

int array_ARRAY_;

请注意: 1. 不同数组的数组大小宏会有所不同,因此我们不能在搜索模式中使用 MAX_SIZE_FOR_THIS_ARRAY。 2.变量“数组”的名称也不固定。

我需要在数千行代码中到处搜索 [ ] 并将 [...] 替换为 ARRAY

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: shell vim sed


    【解决方案1】:

    ca[ 将是您使用 vim 的答案。

    因为你也用sed 标记了这个问题,所以这里是 sed 的方式:

    kent$  echo "int array[MAX_SIZE_FOR_THIS_ARRAY];"|sed 's/\[[^]]*\]/_ARRAY_/'
    int array_ARRAY_;
    

    用你的例子,

    sed 's/\[.*]/_ARRAY_/'
    

    这也有效。

    【讨论】:

    • 谢谢。 MAX_SIZE_FOR_THIS_ARRAY 只是一个示例引用。每个数组的宏名称可能不同。
    • @SandeepSingh,第二个示例应该获取每行从[ 到最后一个] 的所有内容。
    【解决方案2】:

    你可以做一个替换:

    :%s/array\[MAX_SIZE_FOR_THIS_ARRAY\]/array_ARRAY_/g
    

    【讨论】:

    • 您好,感谢您的回答。但是宏名称:MAX_SIZE_FOR_THIS_ARRAY 在任何地方都不一样。每个数组可能有不同的大小和与之关联的不同宏。您能否提出一些建议,而不考虑确切的 b/w [ & ] 模式。
    • @SandeepSingh,如果您想获取括号内的所有内容,请使用.* 而不是MAX_SIZE_FOR_THIS_ARRAY,如果您想要,请从表达式的左侧和右侧删除array对出现括号的每个实例都执行此操作,无论它们前面是否有 array
    • @rid 在这种情况下,您可能希望使用.\{-},即.* 的惰性版本。否则,array[0][1] 将被替换为 array_ARRAY_,而不是 array_ARRAY_[1]
    【解决方案3】:

    当光标位于方括号内的任意位置时,您可以使用:

    ca[_ARRAY_

    为了帮助您记住:

    • c 改变
    • 一个左右
    • [ 方括号
    • _ARRAY__ARRAY_

    【讨论】:

    • +1,不知道 vim 中有类似 change around 的东西。你如何在帮助中搜索? (不是普通的:h ca
    • :h text-objects @mohit
    • 谢谢,但有没有什么方法可以让我一次性完成 - 对于文件中的所有位置,无需将光标带到每个数组
    • @SandeepSingh,当然,请参阅jh314's answer。您可以根据自己的情况进行调整。
    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2021-07-23
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多