次の内容を含むファイルがあります。
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
最初の行の「名前」を「something」、2行目の「password」を「somethingelse」、3行目の「name」を「something other」に変更するスクリプトを作成する必要があります。ファイルの発生順序に依存できないため、「名前」の最初の発生を「何か」に変更し、2番目の「名前」の発生を「何か他のもの」に置き換えることはできません。実際に正しいコンテンツを見つけて交換したことを確認するには、周囲の文字列を検索する必要があります。
これまで、私はこのコマンドを使って「名前」の最初の項目を見つけて置き換えようとしました。
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
しかし、うまくいかないので、いくつかの文字をエスケープする必要があるかもしれません。
理想的には、正規表現を使用して2つの「ユーザー名」を一致させ、「名前」のみを変更できることを願っています。これに似ていますが、以下を使用してくださいsed
。
<username>.+?(name).+?</username>
そして括弧内の内容を「something」に置き換えます。
可能ですか?
ベストアンサー1
sed -i -E "s/(<username>.+)name(.+<\/username>)/\1something\2/" file.xml
私はこれがあなたが探しているものだと思います。
説明する:
- 最初の部分の角かっこは、2番目の部分で再利用できるグループ(実際には文字列)を定義します。
\1
2番目の部分の背面は、\2
最初の部分でキャプチャされたi番目のグループへの参照です(番号は1から始まります)。-E
+
拡張正規表現を有効にします(グループ化に必要)。-i
「内部」ファイル編集モードを有効にする