2011-08-25 32 views
6

HTMLページの一部のHTMLタグの内容を、bashスクリプトでsedを使用して置き換えようとしています。何らかの理由で私は何も置き換えていないので、適切な結果を得ていません。それは何か非常に単純な/愚かな私を助ける誰かが世話を見下ろしている必要がありますか?sedを使用してHTMLタグのコンテンツを置き換える

HTMLに置き換える/検索する:これのポイントは、HTMLページを解析し、いくつかの外部データに基づいて数値を更新することです

cat index.html | sed -i -e "s/\<span id\=\"unlockedCount\"\>([0-9]\{0,\})\<\/span\>/${unlockedCount}/g" index.html 

:使用

Unlocked <span id="unlockedCount"></span>/<span id="totalCount"></span> achievements for <span id="totalPoints"></span> points. 

のsedコマンド。最初の実行では、タグの内容は空になります。タグの内容は満たされます。


EDIT:

私は、次のコードになった回答の組み合わせを使用して終了:について@classic @Sorpigal、@tripleeeへ

sed -i -e 's|<span id="unlockedCount">\([0-9]\{0,\}\)</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html 

多くのおかげで、手伝い!

+0

これはcat – Sorpigal

+0

の無用な使用ですが、 "cat"をf.eに変更しています。 "少ない"本当に今私の問題を解決することはありません? – Revell

+1

'sed '...' inputfile'はありませんが、' sed -i'を使いたい場合には正しい方法です。 – tripleee

答えて

5

この試してみてください:あなたはあなたがしたいと言う何

sed -i -e "s/\(<span id=\"unlockedCount\">\)\(<\/span>\)/\1${unlockedCount}\2/g" index.html 
+1

これは初めて失敗します。 spanタグの間に '[0-9] \ {0、\}'をマッチさせる必要があります。 – Sorpigal

+0

スパンの値を置き換えると思われる場合は、これを修正する必要があります – classic

1
sed -i -e 's%<span id="unlockedCount">([0-9]*)</span\>/'"${unlockedCount}/g" index.html 

私は、不要なバックスラッシュの束を取り出したシェル拡張からそれを保護するために正規表現の周りに単一引用符を追加して、繰り返し演算子を固定し、猫の無駄な使用を削除しました。グループ化のカッコをバックスラッシュする必要があります。私のsedは、少なくとも、\(... \)を望んでいます。

一重引用符と二重引用符を使用することに注意してください。一重引用符はシェルの拡張を防ぎますので、シェルが変数を補間したい場合は "$ {unlockedCount}"の前後で使用することはできません。

1

は、あなたがするsedを言っているものではありません。

タグに数字を挿入するか、タグがある場合は置き換えます。 sedに指示していることは、スパンタグとその内容(もしあれば)をシェル変数の値で置き換えることです。

あなたは、複雑で煩わしくて、エロルを起こしやすいエスケープシーケンスをたくさん使用していますが、これは必要ではありません。

はここで何をしたいです:

sed -r -i -e 's|<span id="unlockedCount">([0-9]{0,})</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html 

は注意違い:

  • は、あなたのキャプチャパターンが機能しないであろうことなく、拡張された表現をオンにする-rを追加しました。
  • /の代わりに|を使用して、置換の区切り文字として/をエスケープする必要はありません。
  • 一重引用符はsedなので、シェルの内部からエスケープする必要はありません。
  • 置換セクションにマッチしたspanタグを含めて、削除されないようにしました。
  • unlockedCount変数を展開するために、一重引用符で囲まれた式を閉じてから、後で再度開きます。
  • 省略されたcat |ここでは役に立たなかった。

シェル変数の展開についても二重引用符を使用しましたが、これは良い習慣ですが、空白が含まれていないと実際には必要ありません。

厳密に言えば、-rを追加する必要はありませんでした。あなたが\([0-9]\{0,\}\)と言っていれば平野の古いsedが動作しますが、ここでの考え方は簡略化されています。

+0

-rは有効なsedコマンドではありませんか?少なくともMac OSで。 – Revell

+1

MacOS Xでは、拡張式を有効にするスイッチが異なります(おそらく '-E'、BSDスタイル)。 '-r'はGNU sedスイッチです。 – Sorpigal

関連する問題