次のファイルがあります。
<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