Vim,正则表达式搜索并替换所有缓冲区中的字母大小写更改

时间:2017-06-27 01:30:05

标签: regex vim replace capitalize

我正在处理LaTeX文档。我需要重新格式化我在vim中所有打开缓冲区中的子节标题。

通常,当我需要修改所有缓冲区时,我会在vim内部执行bufdo %s/pattern/replacement/g | update之类的命令。这就是我打算再做的事情。我需要帮助的是模式和替换字符串。

我需要匹配的字符串具有以下格式:

  • \subsection{word}
  • \subsection{some words}
  • \subsection{some Words CAPitalized weirdlY}
  • \subsection{and some with $\control$ sequences in them}

结果搜索和替换应该影响字符串如下所示:

  • \subsection{Word}
  • \subsection{Some Words}
  • \subsection{Some Words Capitalized Weirdly}
  • \subsection{And Some With $\control$ Sequences In Them}

到目前为止,我尝试过的搜索字符串是:

  1. %s/\\subsection{\(.\)\(\w*\)}/\\subsection{\u\1\L\2}/gc
  2. %s/\\subsection{\v<\(.\)\(\w*\)}/\\subsection{\u\1\L\2}/gc
  3. 数字1仅匹配单个单词并将其转换为正确的格式。

    2号不起作用。我的目标是将以下链接中的SO答案中引用的序列与我的需求结合起来,但我想我没有正确使用它。

    我试图用来解决这个问题的资源:

    注意:如果我必须返回并重新输入$\control个字符,如果替换也将它们大写,我会对此感到满意。

1 个答案:

答案 0 :(得分:2)

bufdo %s/\%(\\subsection{.*\)\@<=\%(.*}\)\@=\<\(\w\)\(\w*\)\>/\u\1\L\2/gc

这应该将\subsection{....}块内的所有内容都大写,不幸的是包括内部数学序列,但每次都会要求您进行确认。搜索比链接的“上一个问题”更复杂:

\%(     non-capturing group
\\...{    literal `\subsection{`
.*        any number of characters
\)      end of group
\@<=    zero-width lookbehind

\%(     non-capturing group
.*        any number of characters
\)      end of group
\@=     zero-width lookahead

\<      zero-width start of word
\(      start of 1st group
\w        word letter
\)      end of group
\(      start of 2nd group
\w*       any number of letters
\)      end of group
\>      zero-width end of word