Bash: najlepszy sposób na uzyskanie wszystkich dopasowań ciągów z grep w ciągu [duplikat]

Nov 23 2020

Mam kłopoty ze znalezieniem sposobu na pobranie wszystkich dopasowanych wartości z łańcucha. Mam ciąg XML przechowywany w zmiennej. Z tej zmiennej wyodrębniam ciąg za pomocą grep. Działa to dobrze dla jednego dopasowania, ale ponieważ grep zwraca tylko pierwszą dopasowaną wartość, nie działa dokładnie tak, jak chcę.

XML="..."

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

Czy istnieje lepszy / mądrzejszy sposób rozwiązania tego problemu niż znalezienie wartości, zastąpienie jej w istniejącym ciągu XML, aby nie był już dopasowany, a następnie uruchomienie go w pętli, dopóki nie zostaną znalezione żadne dopasowania?

Krótki przykład 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>

Odpowiedzi

1 etsuhisa Nov 23 2020 at 10:36

Podziel na wiele wierszy i uruchom polecenie grep.

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