0

我得到了一个带有如下 URL 的图像:

<img alt="" src="http://www.example-site.com/folder_with_underscore/folder-with-dash/3635/0/235/NumBerS_and_Uc/image.png" />

我在用着sed "s///g"

所以我正在尝试替换 src 值,但这在大多数情况下是完全不同的。

有没有办法使用sed "s/src=\" (until first " ) / new url /g"

额外信息:

我在 Windows 和PATH=C:\cygwin\bin我的 .bat 文件中使用 Cygwin

4

2 回答 2

5

[^"]将匹配除 之外的任何字符",因此您可以使用:

 sed 's/src="[^"]*"/src="NEWURL"/g'

例子:

[me@home]$ echo '<img alt="" src="http://www.example-site.com/folder_with_underscore/folder-with-dash/3635/0/235/NumBerS_and_Uc/image.png" />' | sed 's/src="[^"]*"/src="http:\/\/stackoverflow.com"/g'
<img alt="" src="http://stackoverflow.com" />

请注意,这将匹配,直到第一次出现"可能是您想要的。如果你真的想匹配直到最后一次出现",你可以简单地做:

 sed 's/src=".*"/src="NEWURL"/g'

正则表达式是贪婪的,因此会占用尽可能多的字符,因此匹配到". 虽然这也适用于上面的示例,但如果您的输入中还有其他内容也包含".

于 2012-09-25T10:43:18.073 回答
1

Shawn 的解决方案大多是正确的,但它没有处理 src url 中出现换行符的情况。 sed真的不是很擅长处理这种情况,但你可以破解一个解决方案:

sed '/src/{
/src="[^"]*"/{ s//src="NEWURL"/; n; }
s/src=".*$/src="NEWURL"/
p
:a
s/.*//;
N
/"/!ba
s/[^"]*"//
}
' input

请注意,上面的许多换行符在某些版本的 sed 中是多余的,但在其他版本中是必需的。(特别是:a分支命令之后和之后的换行符,因为某些版本的 sed 只会在换行符处终止标签。我相信允许标签以分号终止的 sed 版本并不严格符合标准,但这是一种常见的做法。)该脚本在适当的地方进行简单的替换,但是如果在 之后没有找到引号src=",它会进入一个循环删除行,直到"看到终止。这是一个丑陋的解决方案,我建议不要使用 sed 来解析 xml。

于 2012-09-25T11:40:31.920 回答