Vim 或 sed : Replace character(s) within a pattern

标签 vim sed replace

我想在字符 ('_') 前面和后面都是大写字母的所有地方用连字符替换下划线,例如QWQW_IOIO、OP_FD_GF_JK、TRT_JKJ等,整个一个文档都需要替换。

我尝试在 vim 中使用以下方法替换它: :%s/[A-Z]_[A-Z]/[A-Z]-[A-Z]/g 但这导致 QWQW_IOIOQWQ[A-Z]-[A-Z]OIO :(

我尝试使用 sed 命令: sed -i '/[A-Z]_[A-Z]/s/_/-/g' ./file_name 这导致了整个生产线的更换。例如

QWQW_IOIO 变量可能包含 '_' 或 '-' 行被替换为

QWQW-IOIO 变量可能包含 '-' 或 '-'

最佳答案

您对第一个 vim 方法的想法是正确的。但是您需要使用捕获组来记住在 [A-Z] 部分中找到的字符。这些解释得很好here:h/\1 下。作为旁注,我建议使用 \u 而不是 [A-Z],因为它更短也更快。这意味着您想要的解决方案是:

:%s/\(\u\)_\(\u\)/\1-\2/g

或者,如果您想使用魔术设置使其更具可读性:

:%s/\v(\u)_(\u)/\1-\2/g

另一种选择是限制被 \zs\ze 原子替换的搜索部分:

:%s/\u\zs_\ze\u/-/g

这是我所知道的最短的解决方案。

关于Vim 或 sed : Replace character(s) within a pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45065955/

相关文章:

regex - unix sed 不会回溯来完成工作

linux - 将字段转换为时间戳并插入 CSV

python - 列表推导 if condition else 替换

vim - 为什么 vim 选择 vimrc_example.vim 和 _vimrc?

vim - 如何将当前的视觉选择短语插入命令行?

python - Vim、Python 和 Django 自动补全(pysmell?)

javascript - 带有拉丁文和土耳其文字符的 javascript 中的正则表达式

vim - vim 中的有效字符串?

bash - 如何在 sed 中使用 bash 脚本变量

linux - 如何替换两个模式之间的空字符串