私はXMLファイルの属性を置き換えるためにsedを使用していますが、これまではうまく機能しています。
次のタグを含むXMLファイルがあります。
<osgiApplication id="com.mycompany.site.app"
location="com.mycompany.site.app-1.0.0.20160406155451.eba"
name="com.mycompany.site.app" />
新しいEBAファイルが展開されるたびに、場所属性を置き換える必要があります。例: (他のビルドタイムスタンプ)
<osgiApplication id="com.mycompany.site.app"
location="com.mycompany.site.app-1.0.0.20160410173452.eba"
name="com.mycompany.site.app" />
sed
ラベル付きの式を使用してこれを行います。
:a;N;$!ba;0,s|<osgiApplication id="com.mycompany.site.app".*\/>|<osgiApplication id="com.mycompany.site.app" location="com.mycompany.site.app-1.0.0.20160406155451.eba"
動作しています。完璧、実際に異なるタグを持つ別の状況が発生するまで<osgiApplication>
。たとえば、
<osgiApplication id="com.mycompany.site.app"
location="com.mycompany.site.app-1.0.0.20160406155451.eba"
name="com.mycompany.site.app" />
<anotherTag />
これが発生した場合、.*\/>
sed式の基準が原因ですべて最後まで交換していません/>
。最初の項目だけを変更したいです。
つまり、次のような場合があります。
<osgiApplication id="com.mycompany.site.app"
location="com.mycompany.site.app-1.0.0.20160406155451.eba"
name="com.mycompany.site.app" />
<anotherTag />
<anotherTag />
<anotherTag />
私が望む代替品は次のとおりです。
<osgiApplication id="com.mycompany.site.app"
location="com.mycompany.site.app-1.0.0.20160410173452.eba"
name="com.mycompany.site.app" />
<anotherTag />
<anotherTag />
<anotherTag />
しかし、私が現在得るものは次のとおりです。
<osgiApplication id="com.mycompany.site.app"
location="com.mycompany.site.app-1.0.0.20160410173452.eba"
name="com.mycompany.site.app" />
解決策を探していましたが、見つかりませんでした。どんな提案でもいただければ幸いです。ありがとうございます。
ベストアンサー1
あなたの質問に対する最高の答えは実際には正式です。sedを使用しないでください。問題がライン指向でREで表現できない場合、sedは誤ったツールです。状況は次のとおりです。 XMLは一般言語ではないのでどの複雑さが十分に与えられると、REはすぐに失敗します。信頼できる唯一の解決策は、Python標準ライブラリのSAXパーサーなどのXMLパーサーを使用することです。
それにもかかわらず、1つの素晴らしいハッカーは他のハッカーに会う資格があります。 SAXパーサーで作業している間にスクリプトが再び機能するようにするには、より制限的なREまたはawkという2つの方法を試すことができます。
([^/>]+)
代わりに、より厳しいREを使用できます.*
。 REで終わるファイル名のためにやけどをする可能性がありますが、>
これを防ぐことができます。とにかく、クリエイターはそのようなファイル名を作成しません。専門家のヒント: を含むフェンス柱を探すときは、.*
負の文字クラスを使用してください。
より良いオプションはawkです。
# use awk -F '["]' to set FS to a double-quote character
/<osgiApplication id=.*app"/ {
APP=$2
next
}
APP && /location=/ {
if (index($2, APP) {
substr($2, REPLACEMENT, $0)
}
APP = ""
}
これは、適切な開始タグが見つかったら、それをユーザーが提供したREPLACMENTという名前の文字列に置き換えてAPPを設定します。/[/]> *$/
設定中にこのような状況が発生した場合は、さらに注意してください。アプリをリセットして警告を送ってください。しかし、行の始まり/終わりでタグが始まり、停止する場所を知らせるXMLには何もないので、私たちはまだハッキングをしています。