sed(正規表現優先)を使用して複雑な文字列を検索および置換する

sed(正規表現優先)を使用して複雑な文字列を検索および置換する

次の内容を含むファイルがあります。

<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番目の部分で再利用できるグループ(実際には文字列)を定義します。
  • \12番目の部分の背面は、\2最初の部分でキャプチャされたi番目のグループへの参照です(番号は1から始まります)。
  • -E+拡張正規表現を有効にします(グループ化に必要)。
  • -i「内部」ファイル編集モードを有効にする

おすすめ記事