बैश: स्ट्रिंग में grep के साथ सभी स्ट्रिंग मैच पाने का सबसे अच्छा तरीका [डुप्लिकेट]
Nov 23 2020
मुझे स्ट्रिंग से सभी मिलान किए गए मान प्राप्त करने का तरीका खोजने में कुछ परेशानियां हो रही हैं। मेरे पास XML स्ट्रिंग एक चर में संग्रहीत है। उस चर से मैं grep के साथ एक स्ट्रिंग निकालता हूं। यह एक मैच के लिए अच्छी तरह से काम करता है, लेकिन चूंकि 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)"