ラインの一部を同じラインの他の部分に置き換える

ラインの一部を同じラインの他の部分に置き換える

次のファイルがあります。

<receiver name="anything" type="com.mycompany.plugin.Timer">
  <property name="interval">5000</property>
  <handler name="ReplaceThis" type="com.mycompany.handler.FileBuilderHandler">
    <property name="buildSomething">true</property>
    <handler name="AlsoReplaceThis" type="com.mycompany.handler.FileExporter">
      <property name="overide">true</property>
    </handler>
  </handler>
</receiver>

<receiver name="anything/other" type="com.mycompany.plugin.Timer">
  <property name="intervall">1000</property>
  <handler name="ThisMustBeReplaceAsWell" type="com.mycompany.handler.FileWatcher">
    <property name="interval">2000</property>
    <handler name="ThisMustBeReplaceAsWell" type="com.mycompany.converter.CSConverter">
      <property name="mandant">CE</property>
      <handler name="RemoveThis" type="com.mycompany.handler.FileExporter">
        <property name="outputDir">/usr1/import</property>
      </handler>
    </handler>

それでは、次から始まるすべての行が欲しいです。

 <handler name="

次から交換しました

 <handler name="ReplaceThis" type="com.mycompany.handler.FileBuilderHandler">

このような

 <handler name="FileBuilderHandler" type="com.mycompany.handler.FileBuilderHandler">

したがって、「name」属性はクラス名(type属性の最後の部分)を持つ必要があります。

この問題を解決するためにsed、awk、grepコマンドを使用する方法を知っている人はいますか?

答え1

サンプル構造と同じ入力の場合は、次のように動作できます。

$ sed -E 's/(handler name=")[^"]*"( *type="([^.]*\.)*([^.]*)">)/\1\4"\2/' file

関連情報