Es gibt einige Daten (XML) in einer Datei, und ich muss Text entfernen (nicht die ganze Zeile, so/d Option von sed passt nicht) von Substring1 bis zu Substring2 (einschließlich beider) nur, wenn es ein Muster enthält. Mein Problem hier ist, dass es verschiedene Formatierungen geben kann, so dass Substring1 und Substring2 entweder in derselben Zeile oder in einer anderen Zeile sein können, oder dass mehrere Paare von Substrin1/2 in derselben Zeile stehen.Entfernen Sie Text zwischen Teilstrings (egal in der gleichen Zeile oder mehrzeilig), nur wenn es Muster enthält
Beispiel (1. Linie - 2 Paar Substrings1/2 und erste enthält PATTERN, 2. Zeile - 1 Paar mit Muster, 3. Zeile - 1 Paar ohne Muster, 4. und 5. Linien - 1 Paar mit Muster, 6. und 7. Linien - 1 Paar ohne Muster):
Substring1 = <?xml
Substring2 = </update>
Pattern = PATTERN
tmp.log
<?xml version="1.0" encoding="UTF-8" PATTERN-line1 <upd_date>2016-03-24</upd_date><upd_time>00:01:00.200</upd_time> blah-blah-blah </update><?xml version="1.0" encoding="UTF-8" blah-blah-blah-line1 <upd_date>2016-03-24</upd_date><upd_time>00:01:00.200</upd_time> blah-blah-blah </update>
<?xml version="1.0" encoding="UTF-8" PATTERN-line2 <upd_date>2016-03-24</upd_date><upd_time>00:01:00.200</upd_time> blah-blah-blah </update>
<?xml version="1.0" encoding="UTF-8" blah-blah-blah-line3 <upd_date>2016-03-24</upd_date><upd_time>00:01:00.200</upd_time> blah-blah-blah </update>
<?xml version="1.0" encoding="UTF-8" PATTERN-line4 <upd_date>2016-03-24</upd_date>
<upd_time>00:01:00.200</upd_time> blah-blah-blah-line5 </update>
<?xml version="1.0" encoding="UTF-8" blah-blah-blah-line6 <upd_date>2016-03-24</upd_date>
<upd_time>00:01:00.200</upd_time> blah-blah-blah-line7 </update>
Expected output:
<?xml version="1.0" encoding="UTF-8" blah-blah-blah-line1 <upd_date>2016-03-24</upd_date><upd_time>00:01:00.200</upd_time> blah-blah-blah </update>
<?xml version="1.0" encoding="UTF-8" blah-blah-blah-line3 <upd_date>2016-03-24</upd_date><upd_time>00:01:00.200</upd_time> blah-blah-blah </update>
<?xml version="1.0" encoding="UTF-8" blah-blah-blah-line6 <upd_date>2016-03-24</upd_date>
<upd_time>00:01:00.200</upd_time> blah-blah-blah-line7 </update>
`ve versucht (ohne vollständigen Erfolg) verschiedene Kombinationen wie folgt aus:
sed -i "s#<?xml.*PATTERN.*</update>##g" tmp.log
sed -i "#<?xml#{p; :a; N; #</update>#!ba; s#.*\n##}; p" tmp.log
perl -pi -e 's/<?xml.*PATTERN.*update>//' tmp.log
Soweit ich sehen kann, diese ganze Linien entfernen und überspringen den Fall, wenn Teil auf verschiedenen Linien befinden. Ich führe hier auch keine echte Überprüfung auf PATTERN durch. Jede Hilfe wird geschätzt.
1480 Elemente stimmen mit '[sed] xml' überein, wenn Sie hier suchen. Hast du einen von ihnen angeschaut? Viel Glück. – shellter
Verwenden Sie stattdessen ein XML-fähiges Tool. –
bitte Ihre erwartete Ausgabe – ssr1012