是否可以用于sed
匹配 html 中脚本标记的源(这不是有效的 xml)并用文件内容替换整个匹配?
例如说 html 包含
<link rel='stylesheet' href="blah.css">
<script src='foo.js'></script>
<script type="text/javascript" src="bar.js"></script>
<title />
我不仅想从内部匹配“foo.js” src='foo.js'
,还想替换该文件中的内容的foo.js,所以结束
<link rel='stylesheet' href='blah.css'>
<script>var foo = {};</script>
<script>var bar = [];</script>
<title />
在正则表达式中,我可以匹配脚本标记 src 值,如下所示:
<script\s+(?:[^>]*?\s+)?src=(["'])(.*?)\1
比赛在第二个捕获组中。
我不介意重写整行,但是如何让 sed 匹配该表达式 - 它似乎不喜欢捕获组或反向引用(至少,我尝试的方式:我知道它确实如此)。我得到一个无益的
syntax error near unexpected token `)'
另外,如何捕获文件名,然后将其内容作为替换行传回?
答案1
我会用awk反而:
awk '
match($0, "<script src=." jsfile ".></script>") {
print "<script>"
while (getline line < jsfile) print line
print "</script>"
next
}
{print}
' jsfile=foo.js file.html
哪个输出
<link rel='stylesheet' href="blah.css">
<script>
var foo = {};
var bar = [];
</script>
<script type="text/javascript" src="bar.js"></script>
<title />
要将输出保存回原始 html 文件:
tmp=$(mktemp)
awk ... > "$tmp" && mv "$tmp" file.html