XML エンティティ値を順方向検索で置き換える

XML エンティティ値を順方向検索で置き換える

sedファイルに対して非常に簡単なタスクを実行しようとしています。

sed 's:(?<=<Type>)default(?=</Type>):super:' < myfile.xml

コンセプトはとても簡単です。積極的に見てタグを見つけて、コンテンツを「super」に置き換えてください。残念ながら動作しません、何も交換されません。私は何が間違っていましたか?

次のようなファイルを「編集」しようとしています。

<Hello>
    <World>
        <Type>default</Type>
    </World>
</Hello>

次のようにしてください。

<Hello>
    <World>
        <Type>super</Type>
    </World>
</Hello>

答え1

正規表現は正確ですが、sedツアーを処理しません。あなたのコードは以下を使用して正常に動作しますperl

perl -pe 's:(?<=<Type>)default(?=</Type>):super:' your.file

正規表現は通常XML処理には適していないので、試してみることをお勧めします。XMLスター:

xml ed -O -u '//Type' -v 'super' your.file

perlxml場所で編集できるため、交換は不要ですsed

答え2

sedでPerl正規表現構文を使用しようとすると機能しません。 Sedが使用するもの基本正規表現パールは拡張正規表現そしてその他の機能。 LookaroundはPerlのユニークな機能の1つです。他の最新の正規表現の実装では見つかりますが、sedでは見つかりません。

ここでは見回す必要はありません。置換したいパターンの先頭または末尾にある前方ナビゲーションを変数置換テキストに簡単に変換できます。また、見ることができます一致するパターンに続く行部分のみを返しますより多くの例と説明を見るには

sed 's:\(<Type>\)default\(</Type>\):\1super\2:'

ここでは、逆方向検索と順方向検索が一定であるため、単純な文字列置換も実行できます。

sed 's:<Type>default</Type>:<Type>super</Type>:'

答え3

入力のどの部分が可変で、どの部分が定数なのかよくわかりません。Type変数が仮定数であるdefaultsuper仮定すると、次のsedスクリプトを使用できます。

s:<\([^>]\+\)>default</\1>:<\1>super</\1>:

関連情報