したがって、すべてのパターンマッチングから削除したいスペースがない長い文字列があります。文字列は次のとおりです。
bdy11<entryunit="phoenix"><name>costperdps</name><value>27.75</value></entry><entryunit="phoenix"><name>damage</name><value>5</value></entry><entrbdy623yunit="phoenix"><name>dps</name><value>9.01</value></entry><entryunit="phoenix"><name>dpsplusbonus</name><value>18.02</value></entry><entryunit="phoenix"><name>dpsplusupgbonus</name><value>23.42</value></entry><entryunit="phoenix"><name>dpsplusupgrades</name><value>14.41</value></entry><entryunit="phoenix"><name>range</name><value></value></entry><entryunit="phoenix"><name>targets</name><value>air</value></entry><entryunit="phoenix"><name>upgrade</name><value>1</value></entry><entryunit=bdy624"phoenix"><name>upgrade_damage</name><value></value></entry><entryunit="photoncannon"><name>attack</name><value>1</value></entry><entryunit="photoncannon"><name>bonus_damage</name><value></value></entry><entryunit="photoncannon"><name>bonus_type</name><value></value></entry><entryunit="photoncannon"><name>cooldown</name><value>1.25</value></entry><entryunit="photoncannon"><name>costperdps</name><value>9.38</value></entry><entryunit="photoncannon"><name>damage</name><value>20</value><bdy625/entry><entryunit="photoncannon"><name>dps</name><value>16.00</value></entry><entryunit="photoncannon"><name>dpsplusbonus</name><value></value></entry><entryunit="photoncannon"><name>dpsplusupgbonus</name><value></value></entry><entryunit="photoncannon"><name>dpsplusupgrades</name><value>16.00</value></entry><entryunit="photoncannon"><name>range</name><value></value></entry><entryunit="photoncannon"><name>targets</name><value>both</value></entry><entryunit="photoncannon"><name>upgrbdy626ade</name><value></value></entry><entryunit="photoncannon"><name>upgrade_damage</name><value></value></entry><entryunit="probe"><name>attack</name><value>1</value></entry><entryunit="probe"><name>bonus_damage</name><value></value></entry><entryunit="probe"><name>bonus_type</name><value></value></entry><entryunit="probe"><name>cooldown</name><value>1.50</value></entry><entryunit="probe"><name>costperdps</name><value>15.00</value></entry><entryunit="probe"><name>damage</name><value>5</valubdy627e></entry><entryunit="probe"><name>dps</name><value>3.33</value></entry><entryunit="probe"><name>dpsplusbonus</name><value></value></entry><entryunit="probe"><name>dpsplusupgbonus</name><value></value></entry><entryunit="probe"><name>dpsplusupgrades</name><value>3.33</value></entry><entryunit="probe"><name>range</name><value></value></entry><entryunit="probe"><name>targets</name><value>ground</value></entry><entryunit="probe"><name>upgrade</name><value></value></entry><entryunit="probe">bdy628<name>upgrade_damage</name><value></value></entry><entryunit="sentry"><name>attack</name><value>1</value></entry><entryunit="sentry"><name>bonus_damage</name><value></value></entry><entryunit="sentry"><name>bonus_type</name><value></value></entry><entryunit="sentry"><name>cooldown</name><value>1.00</value></entry><entryunit="sentry"><name>costperdps</name><value>25.00</value></entry><entryunit="sentry"><name>damage</name><value>6</value></entry><entryunit="sentry"><name>dps</name><value>6bdy629.00</value></entry><entryunit="sentry"><name>dpsplusbonus</name><value></value></entry><entryunit="sentry"><name>dpsplusupgbonus</name><value></value></entry><entryunit="sentry"><name>dpsplusupgrades</name><value>9.00</value></entry><entryunit="sentry"><name>range</name><value></value></entry><entryunit="sentry"><name>targets</name><value>both</value></entry><entryunit="sentry"><name>upgrade</name><value>1</value></entry><entryunit="sentry"><name>upgrade_damage</name><value></value></entrbdy630y><entryunit="stalker"><name>attack</name><value>1</value></entry><entryunit="stalker"><name>bonus_damage</name><value>4</value></entry><entryunit="stalker"><name>bonus_type</name><value>armored</value></entry><entryunit="stalker"><name>cooldown</name><value>1.44</value></entry><entryunit="stalker"><name>costperdps</name><value>25.20</value></entry><entryunit="stalker"><name>damage</name><value>10</value></entry><entryunit="stalker"><name>dps</name><value>6.94</value></entry><entryunit="bdy631stalker"><name>dpsplusbonus</name><value>9.72</value></entry><entryunit="stalker"><name>dpsplusupgbonus</name><value>11.81</value></entry><entryunit="stalker"><name>dpsplusupgrades</name><value>9.03</value></entry><entryunit="stalker"><name>range</name><value></value></entry><entryunit="stalker"><name>targets</name><value>both</value></entry><entryunit="stalker"><name>upgrade</name><value>1</value></entry><entryunit="stalker"><name>upgrade_damage</name><value></value></entry><entryunit="vbdy632oidray"><name>attack</name><value>1</value></entry><entryunit="voidray"><name>bonus_damage</name><value>4</value></entry><entryunit="voidray"><name>bonus_type</name><value>armored</value></entry><entryunit="voidray"><name>cooldown</name><value>.60</value></entry><entryunit="voidray"><name>costperdps</name><value>35.00</value></entry><entryunit="voidray"><name>damage</name><value>6</value></entry><entryunit="voidray"><name>dps</name><value>10.00</value></entry><entryunit="voidray">bdy633<name>dpsplusbonus</name><value>16.67</value></entry><entryunit="voidray"><name>dpsplusupgbonus</name><value>21.67</value></entry><entryunit="voidray"><name>dpsplusupgrades</name><value>15.00</value></entry><entryunit="voidray"><name>range</name><value></value></entry><entryunit="voidray"><name>targets</name><value>both</value></entry><entryunit="voidray"><name>upgrade</name><value>1</value></entry><entryunit="voidray"><name>upgrade_damage</name><value></value></entry><entryunit="vobdy634idraycharged"><name>attack</name><value>1</value></entry><entryunit="voidraycharged"><name>bonus_damage</name><value>8</value></entry><entryunit="voidraycharged"><name>bonus_type</name><value>armored</value></entry><entryunit="voidraycharged"><name>cooldown</name><value>.60</value></entry><entryunit="voidraycharged"><name>costperdps</name><value>26.25</value></entry><entryunit="voidraycharged"><name>damage</name><value>8</value></entry><entryunit="voidraycharged"><name>dps</nbdy635ame><value>13.33</value></entry><entryunit="voidraycharged"><name>dpsplusbonus</name><value>26.67</value></entry><entryunit="voidraycharged"><name>dpsplusupgbonus</name><value>36.67</value></entry><entryunit="voidraycharged"><name>dpsplusupgrades</name><value>18.33</value></entry><entryunit="voidraycharged"><name>range</name><value></value></entry><entryunit="voidraycharged"><name>targets</name><value>both</value></entry><entryunit="voidraycharged"><name>upgrade</name><value>1<bdy636/value></entry><entryunit="voidraycharged"><name>upgrade_damage</name><value>1</value></entry><entryunit="zealot"><name>attack</name><value>2</value></entry><entryunit="zealot"><name>bonus_damage</name><value></value></entry><entryunit="zealot"><name>bonus_type</name><value></value></entry><entryunit="zealot"><name>cooldown</name><value>1.20</value></entry><entryunit="zealot"><name>costperdps</name><value>7.50</value></entry><entryunit="zealot"><name>damage</name><value>8</value></entrybdy637><entryunit="zealot"><name>dps</name><value>13.33</value></entry><entryunit="zealot"><name>dpsplusbonus</name><value></value></entry><entryunit="zealot"><name>dpsplusupgbonus</name><value></value></entry><entryunit="zealot"><name>dpsplusupgrades</name><value>18.33</value></entry><entryunit="zealot"><name>range</name><value></value></entry><entryunit="zealot"><name>targets</name><value>ground</value></entry><entryunit="zealot"><name>upgrade</name><value>1</value></entry><entryunit="zealotbdy638"><name>upgrade_damage</name><value></value></entry></record>trl000000204000001410
bdyの後に2桁、bdyの後に3桁が出るたびに削除したいと思います。これまで正規表現と一緒にsedを使ってみましたが、正規表現にバグがあると思います。
sed 's/(.*bdy\d\d)//g; s/(.*bdy\d\d\d)//g' newTarget
パイプを使用してテキストを変換する予定です。
sed -e "
s|<tag>|\n&|
s/.*\n//
s|</tag>|&\n|
/\n/P;D
" newTarget > newTarget2
ラベル間のデータをより簡単に抽出できるように、各ラベルを新しい行に配置するには、この操作を実行する前にbdyとラベルの間に表示される番号を削除する必要があります。
答え1
文字列を有効なXMLに変換したいとします。文字列を削除するだけでなく、タグとその属性(現在一緒に作成されている)を変更し、先頭に欠落しているbdy
開始タグを追加し、最後の文字列を削除する必要があります。entry
unit
entryunit
<record>
trl
echo
以下を使用してこれを実行し、sed
より読みやすくするためにフォーマットを再指定できますxmlstarlet
。
{
echo '<record>'
sed -e 's/bdy[0-9]\{2,3\}//g' \
-e 's/entryunit/entry unit/g' \
-e 's/trl[0-9]*$//' file
} | xmlstarlet fo
または一行で、
{ echo '<record>'; sed -e 's/bdy[0-9]\{2,3\}//g' -e 's/entryunit/entry unit/g' -e 's/trl[0-9]*$//' file; } | xmlstarlet fo
xmlstarlet
このビットは、文書の形式を適切に再指定する場合にのみ必要です。フォーマットを再指定しなくても、XMLパーサーはまだ問題なく読み取ることができます。
このsed
コマンドは最初にすべてのbdy
文字列を削除します。bdy
部分文字列の後の1桁または2桁の数字を一致させるために使用されます。[0-9]\{2,3\}
これは、「0~9の間の2桁または3桁の数字」を意味します。
単純な置換を使用するように文字列entryunit
が修正されました。entry unit
trl
最後に置き換えられた文字列とそれに続く数値文字列を削除します。
フォーマットを再指定すると、xmlstarlet
出力は次のようになります。
<?xml version="1.0"?>
<record>
<entry unit="phoenix">
<name>costperdps</name>
<value>27.75</value>
</entry>
<entry unit="phoenix">
<name>damage</name>
<value>5</value>
</entry>
[...]
<entry unit="zealot">
<name>upgrade</name>
<value>1</value>
</entry>
<entry unit="zealot">
<name>upgrade_damage</name>
<value/>
</entry>
</record>
後で生成されたXML文書の形式を再指定するかどうかにかかわらず、ツールを使用してxmlstarlet
次のようにデータを抽出できます。
xmlstarlet sel -t -v '//entry[@unit="photoncannon" and name="cooldown"]/value' -nl file
上記の出力は、属性と子ノードの値を持つノードの値ですvalue
。つまり、光子泡のクールダウン値を取得します。entry
unit
photoncannon
name
cooldown
シェル変数から取得したパラメータを使用してください。
unit=photoncannon
name=cooldown
xmlstrlet sel -t \
--var unit="'$unit'" \
--var name="'$name'" \
-v '//entry[@unit=$unit and name=$name]/value' -nl file
(使用される特定の引用符に注意してください。内部変数にはXMLでエンコードされた文字列を含める必要があります。$unit
これ$name
は明示的な引用符が必要であることを意味します。)
明らかに、別のXMLパーサーを使用して同じことを実行できます。次の用途xq
(ここ)はJSONパーサーの上にあるXMLパーサーですjq
。つまり、まずXML文書をJSONに変換してから、jq
結果データを解析するために呼び出します。
unit=photoncannon
name=cooldown
xq -r \
--arg unit "$unit" \
--arg name "$name" \
'.record.entry[] | select(."@unit" == $unit and .name == $name).value' file