私は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