regex - Vim - sed 像标签或仅在模式内替换

标签 regex vim sed label

在一些 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”。

我知道三种方法:

  1. 我希望只能在 '"http://[^"]*"' 内进行替换正则表达式(类似于仅在匹配行中替换 - 但这次不是整行而是只涉及匹配模式)

  2. 或者使用类似 sed 的标签 - 我可以使用 sed -e :a -e 's#\("http://[^" ]*\) \([^"]*"\)#\1_\2#g;ta' 完成这个任务

  3. 我也知道有类似 "\@<=" 的东西但我不是母语人士,关于这方面的 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/

相关文章:

javascript - 使用正则表达式拆分复杂的字符串

regex - 从 ifconfig 解析接口(interface)

javascript - 两个不同字符串的单个正则表达式

python - .isin() 和字符串的奇怪问题(Python/Pandas)

php - 如何配置 ctags 来索引 PHP namespace 及其别名?

vim - 如何根据缓冲区中已经找到的单词使 Vim 自动完成一个单词?

vim - 应用 vimrc 更改而不重新启动

Vim 或 sed : Replace character(s) within a pattern

bash - 如何从 shell 脚本获取电子邮件中的换行符?

ruby - 删除 ruby​​ 中的子字符串