首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >vim中分隔符之间的增量数

vim中分隔符之间的增量数
EN

Stack Overflow用户
提问于 2014-02-05 21:14:26
回答 4查看 492关注 0票数 2

我的问题是关于一个非常具体的搜索和替换模式,但我希望为更一般的情况找到答案。我目前正在处理一些带有分配覆盖的LaTeX幻灯片,我需要将某些整数增加一个或多个。样本文本:

代码语言:javascript
运行
复制
\only<1,5-7,9>{hello 11}

简而言之, only 命令只在幻灯片1、5到7和9上显示hello 11。在第2位置插入幻灯片之后,我需要幻灯片2上面的所有幻灯片来增加。这就是我想出来的:

代码语言:javascript
运行
复制
:.,$s/\d\+/\=str2float(submatch(0))>2?submatch(0)+1:submatch(0)/g

从当前的行到文件的末尾,它将所有整数加到2乘1以上。这意味着11也是递增的,这不是我想要的:

代码语言:javascript
运行
复制
\only<1,6-8,10>{hello 12}

Q1:如何才能在分隔符'<‘’>和'>‘之间匹配和增加整数?

最终,我希望能够通过指定一个模式并将另一个模式应用到结果中来逐步细化搜索模式。例如,我首先在给定示例文本的分隔符之间匹配文本。

代码语言:javascript
运行
复制
/<[^<>]*>

这将突出我引述的案文:

代码语言:javascript
运行
复制
\only"<1,5-7,9>"{hello 11}

现在应用我最初的解决方案来增加分隔符之间的数字。我可以将 grep 命令链接到一个带有管道符号的shell中,用每个新的grep命令来细化结果。

Q2:,这种vim搜索模式的链接有可能吗?

更新:--弗洛里斯的解决方案非常接近。它确实解决了原来的问题,但我没有提到所有的要求。它们是:

代码语言:javascript
运行
复制
- The delimiters are guaranteed to be on one line, e.g., <1,5-7,9>.
- Multiple delimited parts can be on one line, e.g.:
   hello 11\only<1,6-7,9>{hello 11}\only<1,6-7,9>{hello 11}

第二个要求失败,因为解决方案当前返回:

代码语言:javascript
运行
复制
hello 12\only<1,7-8,10>{hello 12}\only<1,7-8,10>{hello 11}

它只会在上次出现'>‘之后忽略整数.我希望结果是:

代码语言:javascript
运行
复制
hello 11\only<1,7-8,10>{hello 11}\only<1,7-8,10>{hello 11}

谢谢你的帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-13 10:24:04

基本上,您需要应用搜索和替换(使用可以计算条件的表达式!)只在某些地方(即<...>部件内部)。

这很难,因为你要么需要:

  • 仔细指定匹配条件,并进行前瞻性和回顾性(正如其他答案所尝试的那样),或
  • <...>上进行匹配,并在内部执行Vim不允许的另一个替换(递归子替换表达式(\=...)是不可能的)

我的PatternsOnText插件的新版本1.30可以处理这个问题:

首先,搜索<...>位置:

代码语言:javascript
运行
复制
/<[^>]\+>

然后,制定一个仅在搜索结果中应用的特殊替换:

代码语言:javascript
运行
复制
:%SubstituteInSearch/\d\+/\=submatch(0) > 2 ? submatch(0) + 1 : submatch(0)/g
票数 1
EN

Stack Overflow用户

发布于 2014-02-05 23:15:27

您需要一个lookahead结构--我认为它如下所示:

代码语言:javascript
运行
复制
:.,$s/[0-9]\+\(.*>\)\@=/\=str2float(submatch(0))>2?submatch(0)+1:submatch(0)/g

我要说的是

代码语言:javascript
运行
复制
\(.*>\)\@=

这是一个“正面展望”,一种零宽度断言,上面写着

前面的东西后面必须跟着任意数量的字符,后面跟着括号。

您可以在vim help或https://stackoverflow.com/a/18391881/1967396中找到更多关于语法的信息(我就是从这里得到的)。

运行上述程序,我确实得到了

代码语言:javascript
运行
复制
\only<1,6-8,10>{hello 11}

作为输出-这就是我认为你想要的。

注意:我在Mac上的vim上测试了这一点。众所周知,它的行为方式与linux版本略有不同(嗯,我从sed的差异推断,我实际上并不知道vim也不同.)。如果这不起作用的话,应该是非常接近的。

票数 2
EN

Stack Overflow用户

发布于 2014-02-05 21:46:26

如果您可以假设\only<....将出现在它自己的一行中,那么您可以简单地

代码语言:javascript
运行
复制
:.,$g/\\only<\d/s/\d\+/\=str2float(submatch(0))>2?submatch(0)+1:submatch(0)/g

即,用于过滤目标行的:global命令(:.,$g/\\only<\d/),然后是未更改的“魔术”替换:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21588649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档