vim 用grep和regex替换模式

0sgqnhkj  于 2022-11-30  发布在  其他
关注(0)|答案(2)|浏览(155)

我想知道我们是否可以用 grep 和regex来做一些事情,以下面的例子为例:

原文

name_1_extratext
name_2_extratext

目的

name_extratext_1
name_extratext_2

我对在 Vim 中做这件事特别感兴趣。谢谢

jgwigjjp

jgwigjjp1#

@bohemian关于grep只做匹配的评论也适用于Vim。“grep”和“regex”不是,也不应该是你在解决问题时使用的含糊的流行语。它们是工具,可能适合也可能不适合你遇到的问题,学习的很大一部分是获得正确的直觉,在什么情况下使用什么工具。
在Vim中,你要做的是一个 * 替换 *,它根本不涉及grep,但它肯定涉及正则表达式。
在此特定情况下,您可以执行以下操作:

:%s/\(.*\)\(_\d\+\)\(.*\)/\1\3\2

或者@bohemian的这个变体回答:

:%s/_\([^_]\+\)_\(.*\)/_\2_\1/

或者任何对你有效和有意义的东西,真的。理想情况下不是你从互联网上复制/粘贴的东西,而是你真正理解的东西。
参考编号:

  • :s命令在用户手册的第10章中介绍::help 10.2,并进一步记录在:help :s下。
  • %的范围也在用户手册的第10章介绍::help 10.3,并进一步记录在:help :range下。
  • Vim自己的正则表达式方言广泛记录在:help pattern下。
ars1skjm

ars1skjm2#

grep不会对其匹配项“执行”任何操作;它只匹配。
使用sed

echo "name_1_extratext" | sed -E 's/_([^_]+)_(.*)/_\2_\1/'

相关问题