关于 bash:Regex 在最后一个正斜杠后捕获和替换

Regex capture and replace %20 after last forward slash

我有一个 tsv 文件,里面有很多 HTML。

我需要在非 .jpg 链接的 href 属性的最后一个正斜杠之后替换 %20
我正在命令行上使用 Perl,我需要正则表达式的帮助。

我尝试了一些正则表达式,这是在现场测试中(下面的链接):

1
]*href="([^"]+(%20)+)[^\\.jpg][^\\/]"[^>]?>

它只匹配一个 标记并且只捕获最后一次出现的 %20.

这是一个带有 tsv 样本的实时测试。

我本可以:

1
text

我必须匹配最后一个正斜杠之后的所有 %20 并用 - 替换它们。

或:

1
 <img border="0" src="http://example.com/path/to-some-folder/another%20folder/one%20more520folder/uploads/2012/02/some%20folder/another%20folder/09%20antichi%20egizi%20-%20Tomba%20di%20Tutankhamen%20ante.jpg" width="80" height="92" alt="09 antichi egizi - Tomba di Tutankhamen" />

我不能匹配 .jpg 的 href 属性,所以上面的最后一个例子需要保持不变。

我也试过这个匹配所有预期的 标签,但我不知道如何在最后一个斜杠之后只捕获所有 %20 以随后应用替换:

1
]*href="([^"]+)[^\\.jpg][^\\/]"[^>]?>

https://regex101.com/r/cS3iB6/2


为了匹配某些分隔符内的 %20,您还可以使用 \\G 运算符(请参阅"您离开的地方:\\\\G 断言"):

You can use \\G to specify the position just after the previous match.

你可以使用的正则表达式是

1
()[^\\/"]*">)

替换为

1
\\1\\2-

这是我的演示

在类似 Perl 的符号中,它看起来像

1
s/()[^\\/"]*">)/\\1\\2-/g


replace %20 after last forward slash of href attributes of non .jpg links

您可以使用以下内容进行匹配:

1
%20(?=(?:(?!\\.jpg">)[^>\\/])*>)

并替换为 -

见演示