Regex vim中转义引号的替换模式

Regex vim中转义引号的替换模式,regex,vim,escaping,Regex,Vim,Escaping,我的文本中有些行包含字符串中正确转义的双引号,有些行不包含双引号 如下图所示: bla1 "aaa"bbb"ccc" bla1 bla2 "aaa\"bbb\"ccc" bla2 替换后的结果应为 bla1 "aaa\"bbb\"ccc" bla1 bla2 "aaa\"bbb\"ccc" bla2 但不是: bla1 "aaa\"bbb\"ccc" bla1 bla2 "aaa\\"bbb\\"ccc" bla2 换句话说,它应该在没有转义的行中转义双引号 不要触碰已经正确逃脱的线路 到

我的文本中有些行包含字符串中正确转义的双引号,有些行不包含双引号 如下图所示:

bla1 "aaa"bbb"ccc" bla1
bla2 "aaa\"bbb\"ccc" bla2
替换后的结果应为

bla1 "aaa\"bbb\"ccc" bla1
bla2 "aaa\"bbb\"ccc" bla2
但不是:

bla1 "aaa\"bbb\"ccc" bla1
bla2 "aaa\\"bbb\\"ccc" bla2
换句话说,它应该在没有转义的行中转义双引号 不要触碰已经正确逃脱的线路

到目前为止,我用这个得到了第二个结果

%s:\(\s".\+\)\(".\+\)\(".\+"\s\):\1\\\2\\\3:g
然后我尝试了一个反向查找,告诉引擎不匹配 如果引号前有反斜杠

(?<!\) which in vim should be something like @<!\

%s:\(\s".\+\)\@<!\\\(".\+\)@<!\\\(".\+"\s\):\1\\\2\\\3:g
(?
但我想我有点迷路了

注:
每行只有一个这样的字符串 字符串用双引号括起来,里面可以包含双引号-只有这个内引号应该被转义

:%s/\([^ \\]\)"\([^ ]\)/\1\\"\2/g
这会发现引号前面没有斜杠或空格,后面也没有空格。

这可能会起作用:

%s/\([^\\]\)\("\)/\1\\\2/g

您只需在已编写的命令之一上粘贴一个全局反转。现在它只适用于不包含已转义引号的行:

:v/\\"/s:\(\s".\+\)\(".\+\)\(".\+"\s\):\1\\\2\\\3:g

因为您说过每行只有一个字符串,所以您可以链接替换命令以获得所需的结果。(这也导致在命令的所有部分中使用更简单的正则表达式)


submatch(0)
是引号之间的所有内容。然后,我们将替换前面没有斜杠的所有引号(
\\@首先,你不需要捕捉引号,你知道
\2
总是一个引号,其次,这也会得到外部引号。凯文,这不起作用-我给这个问题添加了一个注释重要的部分是,我只想避开一对双引号中的双引号,而不是全部双引号Quoteseems开始工作。请您解释一下关于第一部分v/\\/签出
:h global
。使用
v
而不是
g
将命令应用于与模式不匹配的行,在这种情况下,这只是一个反斜杠。感谢这个好技巧,但在类似于bla\bla3“aaa”bbb“ccc”的情况下会失败bla3在实际字符串之前blabla中有一个反斜杠Hi这个答案比Jeff的答案好我修改了输入输出数据,以表明即使字符串中有多个引号它也能工作。我将接受它。只有一个小情况下它不能像我希望的那样工作,例如:bla\bla5“aaa”bbb“bbb”“ccc”bla5变为bla\bla5“aaa\“bbb\”bbb\“ccc”bla5如果内部有两个双引号,则为这种情况”“也许你知道如何让它在这个案例中起作用,对不起,我现在按enter键太早了,评论应该是fine@szydan我在第二个替换命令中更改了正则表达式,改为使用负向后看。当两个引号相邻时,这种方法有效。
:%s/"\zs.*\ze"/\=substitute(submatch(0), '\\\@<!"', '\\"', 'g')
substitute(submatch(0), '\\\@<!"', '\\"', 'g')
bla1     "aaa"bbb"ccc"      bla1
bla2     "aaa\"bbb\"ccc"    bla2
bla\bla3 "aaa"bbb"ccc"      bla3 
blabla4  "aaa"bbb" "BBB"ccc" bla4       
bla\bla5 "aaa"bbb" "BBB"ccc" bla5
bla\bla5 "aaa"bbb""BBB"ccc" bla5
bla1     "aaa\"bbb\"ccc"      bla1
bla2     "aaa\"bbb\"ccc"    bla2
bla\bla3 "aaa\"bbb\"ccc"      bla3 
blabla4  "aaa\"bbb\" \"BBB\"ccc" bla4       
bla\bla5 "aaa\"bbb\" \"BBB\"ccc" bla5
bla\bla5 "aaa\"bbb\"\"BBB\"ccc" bla5