在一些 html 编辑的基础上,我想到了需要一些 VIM 大师的帮助。
我不想完成简单的任务 - 我有 html 文件,其中包含损坏的 url。
<a href="http://some/wrong/url with variable number of spaces">Just description</a> <a href="http://some/wrong/url with three spaces">Just description</a>
...
<a href="http://anoter/wrong/url with completely other number of spaces">Just description</a>
不幸的是,它不是“每行一个 url”。
我知道三种方法:
我希望只能在
'"http://[^"]*"'
内进行替换正则表达式(类似于仅在匹配行中替换 - 但这次不是整行而是只涉及匹配模式)或者使用类似 sed 的标签 - 我可以使用 sed -e :a -e
's#\("http://[^" ]*\) \([^"]*"\)#\1_\2#g;ta'
完成这个任务我也知道有类似
"\@<="
的东西但我不是母语人士,关于这方面的 vim 手册超出了我的理解范围。
非常感谢所有帮助。
如果可能的话,我想知道所有三个问题的答案(因为这些问题非常有趣并且对其他任务有帮助),但其中任何一个都可以。
最佳答案
回复:1. 您可以通过将 vim 的“将替换作为表达式求值”功能 (:h :s\=
) 与 substitute
函数 (:h substitute()
) 相结合来递归替换:
:%s!"http://[^"]*"!\=substitute(submatch(0), ' ', '_', 'g')!g
回复:2。我不知道 sed
,所以我无法帮助你。
Re: 3. 我看不出 \@<=
在这里有什么帮助。至于它的作用:它相当于 Perl 的 (?<=...)
功能,也称为“正向后视”。您可以将其理解为“如果前面有”:
:%s/\%(foo\)\@<=bar/X/g
“如果前面有 bar
,则将 X
替换为 foo
”,即将每个 foobar
转换为 fooX
(\%( ... \)
仅用于此处分组)。在 Perl 中你会这样写:
s/(?<=foo)bar/X/g;
更多示例和解释可以在 perldoc perlretut
中找到。
关于regex - Vim - sed 像标签或仅在模式内替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14318027/