各パターンマッチングを削除して新しいファイルに書き込む方法

各パターンマッチングを削除して新しいファイルに書き込む方法

したがって、すべてのパターンマッチングから削除したいスペースがない長い文字列があります。文字列は次のとおりです。

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開始タグを追加し、最後の文字列を削除する必要があります。entryunitentryunit<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。つまり、光子泡のクールダウン値を取得します。entryunitphotoncannonnamecooldown

シェル変数から取得したパラメータを使用してください。

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

関連情報