我花了一段时间试图缩小从仅以jpg
或png
结尾的几千行检索网络链接的方法。
如果我使用
%s/\(http.*\(jpg\|png\)\)\=\(.*\|\_s\)/\1/g|%s/\n\=
我可以抓住链接就好了。删除了几千行,只用匹配的链接替换。但是,如果我删除第一个\=
,就像这里
%s/\(http.*\(jpg\|png\)\)\(.*\|\_s\)/\1/g|%s/\n\=
文件中的任何内容都未被更改或删除,并且所有文本都会突出显示为匹配项。
如果我从模式字符串的末尾删除它,它会将每个匹配连接到一行。我理解为什么会这种情况发生的基本原因(单独使用)。也就是说,在这个特定情况下使用时,我错过了为什么它不会以同样的方式发生。 (意思是,链接不会堆积在一行上。)
我的问题是:
为什么第一个示例中的链接保持不变,而不是替换整个文件或完全删除?
为什么在\n
的含义是“匹配0或1 ”时,指定\=
作为可选元素不会删除空值?< / b>
答案 0 :(得分:2)
从正则表达式结束开始,使用
%s/\n\=
你用//代替每一行0或1 \ n,因此你使用g标志不,在除了\ n之外的任何行开头的任何行中, 0部分将匹配,没有任何东西将被替换为任何东西:即线条保持不变。 (带齐柏林飞艇的报价)
相当于:
:%s/^\n
如果删除\ =,则会删除每行中找到的第一个\ n 实际,这就是为什么空行和非末尾的换行符的原因空行被删除。
现在,在这里:
%s/\(http.*\(jpg\|png\)\)\=\(.*\|\_s\)/\1/g
\ =使任何字符串包含0或1个\(http.*\(jpg\|png\)\)
模式,后跟任何(因为您有\(.*\|\_s\)
),被第一个保存的模式替换。
基本上,您匹配整个文件并仅阻止此模式:\(http.*\(jpg\|png\)\)
被删除。
当您删除\ =时,匹配的0部分会丢弃,并且只有实际具有\(http.*\(jpg\|png\)\)
模式的行才会使用本身替换匹配的模式从http到jpg / png,删除之后的任何内容。
另一方面,如果您保存模式但不在替换字符串中使用它,那么无论如何都会丢失该模式。
如果你实际上只想保持 http..jpg / png行并删除其他行,你可以使用g!或v命令:
:v/http.*jpg\|png/d
删除不具有匹配模式的所有行。