Regex 如果尚未在vim中替换,则将%替换为\%

Regex 如果尚未在vim中替换,则将%替换为\%,regex,vim,Regex,Vim,我有一些文本,其中有些是%,有些是\%。我想将所有出现的%替换为\%,而不将\%转换为\\%。我试过: %s/\\\@!%/\\%/g 但它不起作用 示例文本可以是: This % and this % should be replaced but not these two: \% and \%. 谢谢您的帮助。Vim支持负面外观落后,如下所示: :s/\(\\\)\@<!%/\\%/g :s/\(\\\)\@ 具体如下: s/#替换。。。 \(#启动第1组 \\#反斜杠 \)#终

我有一些文本,其中有些是
%
,有些是
\%
。我想将所有出现的
%
替换为
\%
,而不将\%转换为
\\%
。我试过:

%s/\\\@!%/\\%/g
但它不起作用

示例文本可以是:

This % and this % should be replaced but not these two: \% and \%.

谢谢您的帮助。

Vim支持负面外观落后,如下所示:

:s/\(\\\)\@<!%/\\%/g
:s/\(\\\)\@
具体如下:

s/#替换。。。
\(#启动第1组
\\#反斜杠
\)#终端组1
\@

您也可以执行
:s/%/\\%/g
,然后执行
:s/\\\\%/\\\\%/g

Vim支持负片向后看,如下所示:

:s/\(\\\)\@<!%/\\%/g
:s/\(\\\)\@
具体如下:

s/#替换。。。
\(#启动第1组
\\#反斜杠
\)#终端组1
\@
您还可以从控制台执行
:s/%/\\%/g
,然后执行
:s/\\\\%/\\\%/g

回显替换%和%,但不是\%和\%|sed-es/%/\\\%/g

给予 替换%和%,但不替换\%和\%

希望这就是你要找的。如果是这样,只需使用

cat FileName | sed-e s/%/\\\\%/g

来自控制台

回显替换%和%,但不是\%和\%|sed-es/%/\\\%/g

给予 替换%和%,但不替换\%和\%

希望这就是你要找的。如果是这样,只需使用


cat FileName | sed-es/%/\\\\%/g

我们可以在这里利用
的贪婪性

:%s/\\\?%/\\%/g
  • \\\?
    将匹配
    \
    零次或一次。由于
    是贪婪的,如果
    \
    存在,它将消耗
  • 因此,实际上,
    \%
    %
    都将被
    \%
    取代

    • 我们可以在这里利用
      的贪婪性

      :%s/\\\?%/\\%/g
      
      • \\\?
        将匹配
        \
        零次或一次。由于
        是贪婪的,如果
        \
        存在,它将消耗
      • 因此,实际上,
        \%
        %
        都将被
        \%
        取代


      /(?应该可以工作,但我不知道vim支持正则表达式内部的“负查找”操作。它不工作:
      找不到模式:(?我知道
      vim
      不支持它,但这是您需要的表达式。我不知道除了三次传递之外还有什么合理的替代方法:用一些其他垃圾替换
      \%
      ,用
      \%
      替换
      %
      ,然后用
      \%
      再次替换其他垃圾。两次传递的方法只是修复了错误的de>\\%
      它生成的东西,将它们修补回单个。如果您遇到困难,您可以使用
      perl
      使用该正则表达式处理此文件。是的
      :%s/\(\\\)\@可以工作。
      @
      /(?应该可以工作,但我不知道vim支持“反向查找”正则表达式内部的操作。它不工作:
      找不到模式:(?我知道
      vim
      不支持它,但这是您需要的表达式。我不知道除了三次传递之外还有什么合理的替代方法:用一些其他垃圾替换
      \%
      ,用
      \%
      替换
      %
      ,然后用
      \%
      再次替换其他垃圾。两次传递的方法只是修复了错误的将其生成的内容删除>\\%
      ,并将其修补回单个。如果您遇到困难,可以使用该正则表达式使用
      perl
      处理此文件。是的
      :%s/\(\\\)\@工作。
      @…这是默认的AFAIK。当然,但是如果你将
      set nomagic
      添加到你的vimrc中,你仍然不想为无数中断的插件贡献力量。在你的模式开始时添加
      \m
      要容易得多。类似的推理也适用于区分大小写。对。但这仍然是一个坏习惯。我不是无论如何,这里是“为一个插件做贡献”。我正在写一个正则表达式来执行搜索和替换操作。编写Vim插件的人应该a)注意可移植性问题,b)对Vim正则表达式非常了解,不会复制和使用一些SO问题中的随机表达式。不,但你正在教人们用Vim编写正则表达式。
      magic
      是他们应该知道的……这是默认的AFAIK。当然,但如果你添加
      set nomagic
      在你的vimrc中。在模式的开头添加
      \m
      要容易得多。类似的推理也适用于区分大小写。对。但这仍然是一个坏习惯。无论如何,我不是在这里“贡献插件”。我正在写一个正则表达式来执行搜索和替换操作。编写Vim插件的人应该注意可移植性问题,b)非常了解Vim正则表达式,不会复制和使用一些SO问题中的随机表达式。不会,但你正在教人们用Vim编写正则表达式。
      magic
      是他们应该知道的事情。可能你想用\\\%替换\\%,因为第一个反斜杠正在转义第二个,并且百分号没有任何符号。但是这只是一个猜测,因为作者没有对此发表任何评论。今天早上有一个正则表达式考虑到了这一点,但现在它已经消失了。好了,OP提到文本在描述中有
      %
      \%
      。。但是,是的,如果
      \\%
      应该被
      \\\%
      替换,我的解决方案将不起作用……你是对的。它说不起作用关于这一点,到目前为止,这是最简单也是最好的解决方案。您可能想用\\\%替换\\%,因为第一个反斜杠正在转义第二个反斜杠,并且百分号没有任何符号。但这只是一个猜测,因为作者没有对此发表任何意见。今天早上有一个正则表达式考虑到了这一点,但是好了,OP提到文本在描述中有
      %
      \%
      ,但是是的,如果
      \\%
      应该被替换的话