【发布时间】:2020-04-07 01:07:51
【问题描述】:
我可以拥有这种类型的html
<script type="text/javascript" charset="utf-8" src="/javascripts/docs/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>
<link rel="stylesheet" href="css/style.css" type="text/css" />
<link rel="stylesheet" href="../common.css" type="text/css" />
我想替换src=" 或href=" 和X.js 或X.css 之间的路径。我在https://regex101.com/r/45ekfL/3 上有一个工作版本,但为什么它不能与 sed 一起工作?
我想要的结果:
<script type="text/javascript" charset="utf-8" src="../doc/new/test/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="../doc/new/test/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="../doc/new/test/jquery.js"></script>
<link rel="stylesheet" href="../doc/new/test/style.css" type="text/css" />
<link rel="stylesheet" href="../doc/new/test/common.css" type="text/css" />
我最接近的 javascript 链接是:
echo '<script type="text/javascript" charset="utf-8" src="js/app.js"></script>' | \
sed -E 's#(src=").*(\w*.js)#\1/new/path/\2#'
带有# 标志,因为我为我的新路径注入了斜线。
它给了我:
<script type="text/javascript" charset="utf-8" src="/new/path/.js"></script>
如果我在最后一个捕获组 (src=").*\/(\w*.js) 之前添加缺少的斜杠,我的 sed 将不再工作。
为什么? 我可以使用命名捕获组吗?是个好主意吗?
我在 osx 上,但该命令也将在 ubuntu 机器上使用。
【问题讨论】:
-
问题是
.*是贪心的,所以它尽可能匹配,然后\w*什么都不匹配。 -
Sed 不支持命名捕获组,它只支持 BRE 和 ERE。
-
它似乎与
(src=").*\/(\w*.js)一起工作正常,请参阅demo。请注意,您需要在js之前转义点。 -
@WiktorStribiżew 它在 osx 上不起作用。我对正则表达式的 sed 处理可能不同。 ://
-
我不知道 osx 但由于
\w是非标准的,你检查过你的 sed 支持它吗?无论如何\w*与文件名不匹配,例如app.min.js或app-v2.js将失败。你可以试试这个:s#(src=")[^"]*(/[^"]*\.js")#\1/new/path\2#。另请注意,使用正则表达式解析 html 通常被认为是一种不好的做法,因为这种语言可能过于复杂,因此您应该只使用具有已知结构的简单 html 片段来执行此操作。