bash 脚本用其内容替换 html 中的脚本标签

bash 脚本用其内容替换 html 中的脚本标签

是否可以用于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 '
    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

相关内容