みんなこんにちは、
私はUNIXに初めて触れたので、VBでできることをしたかったのですが、UNIXでは試した経験はありません。
新しいReuters RICコードがオンラインになったときに定期的に削除して更新する必要がある共有XML仕様があります。実装する2つのプロジェクト:
A. RICエントリの削除
- ファイルを開く
- 特定の文字列を探す
- 見つかった行とその下の21行を削除します。
- アーカイブの保存
私の考えでは、これがうまくいくようです:
sed –e '/<ric id="AUG03250639E=YBAU">/,+21d' a.xml >a.xml
B. 新しいRIC項目を追加
- ファイルを開く
- 最後に発生したスティングを探す
</source>
- 最後のRIC入力ブロックまで29行上に移動
- この行と下の21行をコピーしてください(ricブロック)。
- 22行目の下に新しい行を挿入し、このブロック(新しいブロック)をコピーしたブロックのすぐ下に貼り付けます。
- 新しいブロックの行1のricを新しいRic文字列に変更します
<ricid="AAAAA=YBAU"
。<ricid="BBBBB=YBAU"
- アーカイブの保存
どうすればいいですか?
ファイルの最後の部分です。 (私が操作したい)ricブロックの終わりは、次の文字列が表示されるときです。 。 。
<ric id="AUG03250639E=YBAU">
<securities>
<security>
<issueid>178117</issueid>
<quote-type>YIELD</quote-type>
<complex-logic>
<calculations>
<yield-type>
<type>BID_YIELD</type>
<calculation name="AB" field="RT_YIELD_1" />
</yield-type>
<yield-type>
<type>OFFER_YIELD</type>
<calculation name="AB" field="SEC_YLD_1" />
</yield-type>
</calculations>
</complex-logic>
<derived-type name="PRICE" baseValue="100.0" />
</security>
</securities>
</ric>
<ric id="AUG03250640E=YBAU">
<securities>
<security>
<issueid>178117</issueid>
<quote-type>YIELD</quote-type>
<complex-logic>
<calculations>
<yield-type>
<type>BID_YIELD</type>
<calculation name="AB" field="RT_YIELD_1" />
</yield-type>
<yield-type>
<type>OFFER_YIELD</type>
<calculation name="AB" field="SEC_YLD_1" />
</yield-type>
</calculations>
</complex-logic>
<derived-type name="PRICE" baseValue="100.0" />
</security>
</securities>
</ric>
</rics>
<topics>
<topic>
<id>default</id>
<type>rmds</type>
<value>IDN_SELECTFEED.ANY.%s.NaE</value>
</topic>
</topics>
</source>
<transformers>
<!-- Name of transformer -->
<transformer></transformer>
</transformers>
<processors>
<!-- Enricher to add additional fields from source query result while
publishing -->
<processor></processor>
</processors>
<endpoints>
<!-- Order of post processor is important. First topic, then mapper -->
<endpoint id="rmds" topic="FI.ANY.%s.YBAU" multicast="true">
<postprocessor>reuters-topic-builder</postprocessor>
<postprocessor>reuters-message-mapper</postprocessor>
<!-- <multitopic id="solace" topic="LN/FI/IP/APS/SSHEET/YIELD/BATS_%s"
/> -->
<multitopic id="solace-credit" topic="LN/FI/EP/CREDITBPS/SSHEET/BATS_%s" />
<multitopic id="solace-credit" topic="LN/FI/EP/CREDITBPS/YIELDBROKER/BATS_%s" />
</endpoint>
</endpoints>
<other-properties>
<!-- common formatting of price/yield -->
<property name="formattor-1">(math:pow(INPUT/100+1,0.5)-1)*200</property>
<property name="handle_negative_values">false</property>
<property name="handle_negative_values_output">0.001</property>
</other-properties>
</specification>
したがって、A. AUG03250640E=YBAU を削除しようとしている RIC 項目を削除すると、ファイルに以下が表示されます。
<ric id="AUG03250639E=YBAU">
<securities>
<security>
<issueid>178117</issueid>
<quote-type>YIELD</quote-type>
<complex-logic>
<calculations>
<yield-type>
<type>BID_YIELD</type>
<calculation name="AB" field="RT_YIELD_1" />
</yield-type>
<yield-type>
<type>OFFER_YIELD</type>
<calculation name="AB" field="SEC_YLD_1" />
</yield-type>
</calculations>
</complex-logic>
<derived-type name="PRICE" baseValue="100.0" />
</security>
</securities>
</ric>
</rics>
<topics>
<topic>
<id>default</id>
<type>rmds</type>
<value>IDN_SELECTFEED.ANY.%s.NaE</value>
</topic>
</topics>
</source>
<transformers>
<!-- Name of transformer -->
<transformer></transformer>
</transformers>
<processors>
<!-- Enricher to add additional fields from source query result while
publishing -->
<processor></processor>
</processors>
<endpoints>
<!-- Order of post processor is important. First topic, then mapper -->
<endpoint id="rmds" topic="FI.ANY.%s.YBAU" multicast="true">
<postprocessor>reuters-topic-builder</postprocessor>
<postprocessor>reuters-message-mapper</postprocessor>
<!-- <multitopic id="solace" topic="LN/FI/IP/APS/SSHEET/YIELD/BATS_%s"
/> -->
<multitopic id="solace-credit" topic="LN/FI/EP/CREDITBPS/SSHEET/BATS_%s" />
<multitopic id="solace-credit" topic="LN/FI/EP/CREDITBPS/YIELDBROKER/BATS_%s" />
</endpoint>
</endpoints>
<other-properties>
<!-- common formatting of price/yield -->
<property name="formattor-1">(math:pow(INPUT/100+1,0.5)-1)*200</property>
<property name="handle_negative_values">false</property>
<property name="handle_negative_values_output">0.001</property>
</other-properties>
</specification>
B. 新しい RIC 項目を追加する場合は、新しい ric AUG03250641E=YBAU を追加すると仮定すると、ファイルに以下が表示されます。
<ric id="AUG03250639E=YBAU">
<securities>
<security>
<issueid>178117</issueid>
<quote-type>YIELD</quote-type>
<complex-logic>
<calculations>
<yield-type>
<type>BID_YIELD</type>
<calculation name="AB" field="RT_YIELD_1" />
</yield-type>
<yield-type>
<type>OFFER_YIELD</type>
<calculation name="AB" field="SEC_YLD_1" />
</yield-type>
</calculations>
</complex-logic>
<derived-type name="PRICE" baseValue="100.0" />
</security>
</securities>
</ric>
<ric id="AUG03250640E=YBAU">
<securities>
<security>
<issueid>178117</issueid>
<quote-type>YIELD</quote-type>
<complex-logic>
<calculations>
<yield-type>
<type>BID_YIELD</type>
<calculation name="AB" field="RT_YIELD_1" />
</yield-type>
<yield-type>
<type>OFFER_YIELD</type>
<calculation name="AB" field="SEC_YLD_1" />
</yield-type>
</calculations>
</complex-logic>
<derived-type name="PRICE" baseValue="100.0" />
</security>
</securities>
</ric>
<ric id="AUG03250641E=YBAU">
<securities>
<security>
<issueid>178117</issueid>
<quote-type>YIELD</quote-type>
<complex-logic>
<calculations>
<yield-type>
<type>BID_YIELD</type>
<calculation name="AB" field="RT_YIELD_1" />
</yield-type>
<yield-type>
<type>OFFER_YIELD</type>
<calculation name="AB" field="SEC_YLD_1" />
</yield-type>
</calculations>
</complex-logic>
<derived-type name="PRICE" baseValue="100.0" />
</security>
</securities>
</ric>
</rics>
<topics>
<topic>
<id>default</id>
<type>rmds</type>
<value>IDN_SELECTFEED.ANY.%s.NaE</value>
</topic>
</topics>
</source>
<transformers>
<!-- Name of transformer -->
<transformer></transformer>
</transformers>
<processors>
<!-- Enricher to add additional fields from source query result while
publishing -->
<processor></processor>
</processors>
<endpoints>
<!-- Order of post processor is important. First topic, then mapper -->
<endpoint id="rmds" topic="FI.ANY.%s.YBAU" multicast="true">
<postprocessor>reuters-topic-builder</postprocessor>
<postprocessor>reuters-message-mapper</postprocessor>
<!-- <multitopic id="solace" topic="LN/FI/IP/APS/SSHEET/YIELD/BATS_%s"
/> -->
<multitopic id="solace-credit" topic="LN/FI/EP/CREDITBPS/SSHEET/BATS_%s" />
<multitopic id="solace-credit" topic="LN/FI/EP/CREDITBPS/YIELDBROKER/BATS_%s" />
</endpoint>
</endpoints>
<other-properties>
<!-- common formatting of price/yield -->
<property name="formattor-1">(math:pow(INPUT/100+1,0.5)-1)*200</property>
<property name="handle_negative_values">false</property>
<property name="handle_negative_values_output">0.001</property>
</other-properties>
</specification>
答え1
~のためㅏPOSIXsed
とhead
ユーティリティはもちろん一般in
文書:
{ sed -ne'/^<ric id="AUG03250639E=YBAU">$/q;p'
head -n21 >/dev/null
cat
} <in >out
答え2
構文解析および/または操作という事実に加えて正規表現を含むxmlせいぜい誤解の所持がありますが(気をつければこんなに簡単なのも効果があるかもしれませんが)、ほぼ正しいです。
GNU sedの使用:
sed –i -e '/<ric id="AUG03250639E=YBAU">/,+21d' a.xml
-i
sedが()オプションをサポートしていない場合は、--in-place
一時ファイルを使用してこれを行うことができます(sedが後で動作する方法)。
TF=$(mktemp)
sed -e '/<ric id="AUG03250639E=YBAU">/,+21d' a.xml > "$TF" && mv "$TF" a.xml
試しているように、シェルからファイルを読み取り、出力をそのファイルにリダイレクトすることはできません。シェルが最初にすることは、ファイルを上書きして空にすることです。これは、sedスクリプトが実行される前に発生します。
より複雑なXML解析操作の場合は、シェルスクリプトのXMLパーサーを使用するか、xmlstarlet
PerlまたはPython(または考えられるほとんどすべての言語)用のXML解析ライブラリのいずれかを使用してください。
答え3
XMLを解析するために正規表現を使用しないでください。汚いです。壊れやすい、壊れやすいコードを生成します。できるように問題を引き起こす可能性がある多くのものがあります。要素の形式をXMLとして指定することは完全に有効です。
<calculation name="AB" field="SEC_YLD_1" />
または:
<calculation
field="SEC_YLD_1"
name="AB"
/>
そして他のさまざまなオプション - すべて意味上同じですが...同じ正規表現と一致しません。
たとえば、パーサーを使用すると非常に簡単です。これを簡単に行う方法はperl
ありますか?XML::Twig
削除:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> parsefile ( 'your_file.xml' );
$_ -> delete for $twig -> get_xpath('//ric[@id="AUG03250639E=YBAU"]');
$twig -> set_pretty_print('indented');
$twig -> print;
注 - 重複したアイテムがある場合は削除してください。
これで新しいアイテムを作成します。コピーして修正したいようです。したがって:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> parsefile ( 'your_file.xml' );
#find one to copy - this will just get the first 'ric' element.
my $ric_to_copy = $twig -> get_xpath('//ric',0);
#copy it
my $new_ric = $ric_to_copy -> copy;
#alter the new one
$new_ric -> set_att('id', 'BBBBB=YBAU' );
#paste it
$new_ric -> paste ( 'last_child', $ric_to_copy->parent);
$twig -> set_pretty_print('indented');
$twig -> print;
次に、STDOUTを読み込み、印刷します。特定のファイルに印刷できます。
my ( $output, '>', 'new.xml') or die $!;
print {$output} $twig -> sprint;
close ( $output );