HTMLを検索して置換または削除するLinux で sed を使用してタグを付ける

HTMLを検索して置換または削除するLinux で sed を使用してタグを付ける

<li>多くの index.html ページから次の HTML タグを削除する必要があります。

<li>
                      <a href="https://forward.global.ssl.fastly.net/contributoragreements/" onclick="_gaq.push(['_trackEvent', 'ClickTracking', 'TopNav_Contact_Editorial', window.location.href]);">Editorial</a>
                    </li>

多くのファイルでこれを再帰的に削除する必要があります。したがって、Linux の sed で正規表現を使用するのが最善のオプションだと思います。さまざまな方法を試しましたが、解決策が見つかりませんでした<li>。index.html ファイル内には他のタグもありますが、それらは編集しないでください。上記のタグのみを削除する必要があります。

よろしくお願いします。

答え1

ドキュメント フラグメントが適切に形成された XHTML ファイルの一部であると仮定すると、次のようにして値が正確に一致する属性を持つノードをli含むすべてのノードを削除できます。ahrefhttps://forward.global.ssl.fastly.net/contributoragreements/xmlstarlet

xmlstarlet ed --delete '//li[a/@href = "https://forward.global.ssl.fastly.net/contributoragreements/"]' file.xhtml

ドキュメントが適切に形成された XHTML ドキュメントでない場合は、まずそれを回復してみることができます。

xmlstarlet fo --recover --html file.html |
xmlstarlet ed --delete '//li[a/@href = "https://forward.global.ssl.fastly.net/contributoragreements/"]'

index.htmlで rotted されたディレクトリ構造内のすべてのファイルに対してこれを実行するにはtop-dir、次のようxmlstarletに から呼び出します。find

find top-dir -type f -name index.html -exec sh -c '
    tmpfile=$(mktemp)
    for pathname do
        cp "$pathname" "$tmpfile"
        xmlstarlet fo --recover --html "$tmpfile" |
        xmlstarlet ed --delete "//li[a/@href = \"https://forward.global.ssl.fastly.net/contributoragreements/\"]" >"$pathname.new"
    done
    rm -f "$tmpfile"' sh {} +

上記では、index.html.new見つかったファイルごとに という新しいファイルが作成されます。上記のコマンドから removed をindex.html使用して実行する前に、これらのファイルを調べて問題がないかどうかを判断する必要があります。.new

明らかにこれを実行する必要がありますコピーテスト中にバックアップしたデータ。

関連情報