如何更改以下 LaTeX 编码:
\cite{1,3-7,9}
到
\cite{1,3,4,5,6,7,9}
在维姆?我更喜欢使用正则表达式。
答案1
您可以使用 vim 的substitute
命令来完成此操作:
:%s/\\cite{1,3-7,9}/\\cite{1,3,4,5,6,7,9}/g
这将替换所有出现的\cite{1,3-7,9}
与\cite{1,3,4,5,6,7,9}
。
要仅替换当前行中存在的匹配项,您可以使用:
:s/\\cite{1,3-7,9}/\\cite{1,3,4,5,6,7,9}/g
c
如果您希望 vim 在更改任何行之前要求确认,请追加。例如:
:%s/\\cite{1,3-7,9}/\\cite{1,3,4,5,6,7,9}/gc
答案2
m-n
要扩展表达式中形式范围的任何单个实例\cite{...}
,您可以执行以下操作
perl -pe 's/\\cite{(?:\d+,)*\K(\d+)-(\d+)(?=(?:,\d+)*})/sprintf "%s", join(",", ($1..$2))/e' file.tex
答案3
和我的PatternsOnText 插件,您可以将:substitute
命令限制为模式匹配(\cite{...}
在您的情况下):
:%SubstituteInSearch/\\cite{[^}]\+}/\(\d\+\)-\(\d\+\)/\=join(range(submatch(1),submatch(2)), ',')/g
正则表达式解析起始数字和结束数字,并使用join()
和将它们转换为数字范围。range()
:help sub-replace-expr
答案4
Vim 通常与 Perl 链接。
在 Vim 中使用 perl (或类似的)的可能性可能是相关的。
当你有 时+perl
,你可以使用:perldo
+ @steeldriver 解决方案(实际上略有不同):
:perldo s/\\cite{(?:\d+,)*\K(\d+)-(\d+)(?=(,.*?)?})/sprintf "%s",join(",", $1..$2)/e