HTMLのスクリプトタグをその内容に置き換えるbashスクリプト

HTMLのスクリプトタグをその内容に置き換えるbashスクリプト

sedhtml(有効な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

一致は2番目のキャプチャグループにあります。

行全体を書き換えるのは大丈夫ですが、その表現と一致するように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

関連情報