我想知道我们是否可以用 grep 和regex来做一些事情,以下面的例子为例:
原文:
name_1_extratext name_2_extratext
目的:
name_extratext_1 name_extratext_2
我对在 Vim 中做这件事特别感兴趣。谢谢
jgwigjjp1#
@bohemian关于grep只做匹配的评论也适用于Vim。“grep”和“regex”不是,也不应该是你在解决问题时使用的含糊的流行语。它们是工具,可能适合也可能不适合你遇到的问题,学习的很大一部分是获得正确的直觉,在什么情况下使用什么工具。在Vim中,你要做的是一个 * 替换 *,它根本不涉及grep,但它肯定涉及正则表达式。在此特定情况下,您可以执行以下操作:
grep
:%s/\(.*\)\(_\d\+\)\(.*\)/\1\3\2
或者@bohemian的这个变体回答:
:%s/_\([^_]\+\)_\(.*\)/_\2_\1/
或者任何对你有效和有意义的东西,真的。理想情况下不是你从互联网上复制/粘贴的东西,而是你真正理解的东西。参考编号:
:s
:help 10.2
:help :s
%
:help 10.3
:help :range
:help pattern
ars1skjm2#
grep不会对其匹配项“执行”任何操作;它只匹配。使用sed:
sed
echo "name_1_extratext" | sed -E 's/_([^_]+)_(.*)/_\2_\1/'
2条答案
按热度按时间jgwigjjp1#
@bohemian关于
grep
只做匹配的评论也适用于Vim。“grep”和“regex”不是,也不应该是你在解决问题时使用的含糊的流行语。它们是工具,可能适合也可能不适合你遇到的问题,学习的很大一部分是获得正确的直觉,在什么情况下使用什么工具。在Vim中,你要做的是一个 * 替换 *,它根本不涉及
grep
,但它肯定涉及正则表达式。在此特定情况下,您可以执行以下操作:
或者@bohemian的这个变体回答:
或者任何对你有效和有意义的东西,真的。理想情况下不是你从互联网上复制/粘贴的东西,而是你真正理解的东西。
参考编号:
:s
命令在用户手册的第10章中介绍::help 10.2
,并进一步记录在:help :s
下。%
的范围也在用户手册的第10章介绍::help 10.3
,并进一步记录在:help :range
下。:help pattern
下。ars1skjm2#
grep
不会对其匹配项“执行”任何操作;它只匹配。使用
sed
: