2 つの HTML コメント間のテキストを置き換える

2 つの HTML コメント間のテキストを置き換える

私はsed一般的な正規表現の世界に慣れておらず、使い方を調べてきましたが、必要なことに苦労しています。awk

htmラベルとして機能する2つのコメントの間に、ユーザーが入力したテキスト(シェルスクリプトを介して)で更新する必要がある1行の通知を含むページがあります。たとえば、次のようになります。

<!--BeginNoticeMSG-->NOTICE: This is a notice<!--EndNoticeMSG-->

その後、ユーザーが入力したテキスト(変数に保存されている$NEWNOTICE)はタグ間の内容を置き換える必要があるため、次のように機能します。

<!--BeginNoticeMSG-->$NEWNOTICE<!--EndNoticeMSG-->

ファイルに挿入されますhtm(例:)。

<!--BeginNoticeMSG-->This is a test notice<!--EndNoticeMSG-->

タグ間のテキストを正しく識別して置き換える方法は?

ベストアンサー1

これは、指定されたようにあなたのニーズを満たす(かなり)基本的なレシピです。

#!/bin/bash
REPLACEWITH="Your replacement text here"
STARTTAG="BeginNoticeMSG"
ENDTAG="EndNoticeMSG"
sed -E "s/(<\!\-\-$STARTTAG\-\->)(.*)(<\!\-\-$ENDTAG\-\->)/\1$REPLACEWITH\3/" -i target_file.html

入力が異なる場合は、さまざまな方法で分離されます。特に、入力「ラベル」が複数行に分割されている場合は、さらにそうです。

正規表現を使用してHTMLとXMLを処理することは通常推奨されません(これはコメントにすぎないことを知っています)。ただし、この記事で提案されているように、入力が信頼できる場合は、この簡単なアプローチが機能する可能性があります。

この場合、代替項目を入力するために必要なテキストの量を減らすために、ラベルの一部を\1\3正規表現の括弧内の項目に関連する)として逆参照しました。

または-Eオプションもなく、逆参照もありません。

#!/bin/bash
REPLACEWITH="Text to replace with here"
STARTTAG="BeginNoticeMSG"
ENDTAG="EndNoticeMSG"
sed -e "s/<\!\-\-$STARTTAG\-\->.*<\!\-\-$ENDTAG\-\->/<\!\-\-$STARTTAG\-\->$REPLACEWITH<\!\-\-$ENDTAG\-\->/" -i target_file.html

おすすめ記事