Bash:文字列内のgrepと一致するすべての文字列を取得するための最良の方法[重複]

Nov 23 2020

文字列から一致するすべての値を取得する方法を見つけるのに問題があります。XML文字列を変数に格納しています。その変数から、grepを使用して文字列を抽出します。これは1つの一致でうまく機能しますが、grepは最初に一致した値のみを返すため、希望どおりに機能しません。

XML="..."

VALUE=($(grep -oP "<tag>(.*)</tag>" <<<"${XML}" | cut -d ">" -f 2 | cut -d "<" -f 1))

値を見つけて既存のXML文字列に置き換えて一致しないようにし、一致するものが見つからなくなるまでループで実行するよりも、これに取り組むためのより良い/よりスマートな方法はありますか?

短いXMLの例:

<?xml version="1.0" encoding="UTF-8"?>
<xmlDoc>
  <docName>...</docName>
  <formats>
    <format>
      <name>a:1</name>
    </format>
    <format>
      <name>b:2</name>
    </format>
  </formats>
</xmlDoc>

回答

1 etsuhisa Nov 23 2020 at 10:36

複数行に分割して、grepコマンドを実行します。

VALUE="$(sed 's#</tag>#</tag>\n#g' <<<"${XML}" | grep -oP "<tag>(.*)</tag>" | cut -d ">" -f 2 | cut -d "<" -f 1)"