【问题标题】:Vim substitution of a list of words with another same length list of words?Vim用另一个相同长度的单词列表替换单词列表?
【发布时间】:2025-12-03 14:35:01
【问题描述】:

我需要用同样长的单词列表替换单词列表。

例如,您有: "a","b","c","d","e","f"

你想用每个单词的大写版本替换每个单词: "A","B","C","D","E","F"

我知道如何使用正则表达式查找每个字符串: (a\|b\|c\|d\|e\|f)

我知道您可以对每个单词进行全局替换。但是当单词的长度变长时,这种方法会变得笨拙和不雅。

有没有办法以某种方式进行全局替换?类似于:

:%s/\(a\|b\|c\|d\|e\|f\)/INSERT_REPLACEMENT_LIST/

我不确定这是否可能。

【问题讨论】:

  • 只是为了满足我的好奇心,你介意告诉我,这是干什么用的?我的意思是,在实践中它有什么好处?什么都没想到,所以我想知道。
  • @Idigas,我正在对一些糟糕的 Matlab 代码进行大量重构。我注意到代码使用了 20-30 个全局变量,而他的全局变量并非全部大写或以使它们明显全局的方式命名。 --> 所以我想将它们全部重命名为大写。或者可能是相同的名称,但在每个变量名称后添加“_g”。
  • @Idigas,最终我将在 C 中实现 Matlab。所以我想在转换为 C 之前充分理解并使代码尽可能优雅。
  • @Igor,他对问题中给出的示例给出了具体的解决方案。我在问题中给出的示例是最简单的案例场景,旨在说明我的问题。实际上,每个 a 或 b 或 c 都是一个将被另一个字符串替换的字符串。

标签: regex vim replace substitution


【解决方案1】:

您可以使用映射到其替换项的项目字典,然后在搜索/替换的右侧使用它。

:let r={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E'}
:%s/\v(a|b|c|d|e)/\=r[submatch(1)]/g

:h sub-replace-\=:h submatch()。如果你想把它塞进一行,你可以使用文字字典。

:%s/\v(a|b|c|d|e)/\={'a':'A','b':'B','c':'C','d':'D','e':'E'}[submatch(1)]/g

您给出的大写字母的具体示例将更简单地完成为

:%s/[a-e]/\U\0/g

【讨论】:

  • s/\(\a\+\)/\U\0/g 将字母字符序列更改为大写。
  • 如果你发现自己经常这样做,你可以为此定义一个 vim 函数 (*.com/questions/765894/…)
  • @Brian,你替换的“\v”是什么?
  • @Brian,当我进行替换时,我必须使用反斜杠来转义 '('、'|' 和 ')' 字符。为什么你不必?还是你的语法错误?
  • \v 将正则表达式置于“非常神奇”的模式,这样可以避免反斜杠。见 :h /\v
【解决方案2】:

:%s/(a\|b\|c\|d\|e\|f)/\U\0/g

【讨论】:

    最近更新 更多