sed:最初のワイルドカード文字のみを置き換える

sed:最初のワイルドカード文字のみを置き換える

私は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には何もないので、私たちはまだハッキングをしています。

おすすめ記事