我想在字符 ('_') 前面和后面都是大写字母的所有地方用连字符替换下划线,例如QWQW_IOIO、OP_FD_GF_JK、TRT_JKJ等,整个一个文档都需要替换。
我尝试在 vim 中使用以下方法替换它:
:%s/[A-Z]_[A-Z]/[A-Z]-[A-Z]/g
但这导致 QWQW_IOIO
和 QWQ[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/