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
perl
xml
場所で編集できるため、交換は不要です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
変数が仮定数であるdefault
とsuper
仮定すると、次のsed
スクリプトを使用できます。
s:<\([^>]\+\)>default</\1>:<\1>super</\1>: