Suchen und ersetzen über mehrere zeilen (awk oder sed)
wie oben schon angedeutet, ich benötige eure unterstützung.
ich möchte mit awk oder sed einige dateien (über 100) bearbeiten in der ich einen bereich löschen möchte.
und irgend wie bekomme ich den regulären ausdruck nicht hin.
Hier meine Daten, ist eine automatisch generierte datei von wpkg:
und den bereich will ich löschen:
wie kann ich das kürzer und flexibler machen?
ich würde es gerne so lösen:
so das ich alles zwischen package.... und \package> finde.
hoffe hier kann mir jemand helfen.
gruß michael
ich möchte mit awk oder sed einige dateien (über 100) bearbeiten in der ich einen bereich löschen möchte.
und irgend wie bekomme ich den regulären ausdruck nicht hin.
Hier meine Daten, ist eine automatisch generierte datei von wpkg:
<wpkg><package id="acrobat" name="Acrobat Reader 8.1.2" revision="812" reboot="false" priority="10">
<check type="uninstall" condition="exists" path="Adobe Reader 8.1.2 - Deutsch"/>
<install cmd="msiexec /q /i "%SOFTWARE%\pkg\adobe\AcroRead.msi" allusers=1">
<exit code="0"/>
</install>
<remove cmd="MsiExec.exe /q /x{AC76BA86-7AD7-1031-7B44-A70500000002}"/>
<upgrade cmd="msiexec /q /i "%SOFTWARE%\pkg\adobe\AcroRead.msi" allusers=1">
<exit code="0"/>
<exit code="3010"/>
</upgrade>
</package>
><package id="ReportViewer" name="Microsoft Report Viewer Redistributable 2008" revision="2" reboot="false" priority="10">
<check type="uninstall" condition="exists" path="Microsoft Report Viewer Redistributable 2008"/>
<install cmd="%SOFTWARE%\pkg\wsus\ReportViewer.exe /q">
<exit code="0"/>
</install>
<remove cmd="%SOFTWARE%\pkg\wsus\ReportViewer.exe /qu"/>
</package>
<package id="jre" name="Java Runtime Environment 1.5.0_08" revision="1" reboot="true" priority="2">
<check type="uninstall" condition="exists" path="J2SE Runtime Environment 5.0 Update 8"/>
<install cmd="msiexec /q /i %SOFTWARE%\pkg\java\jre1.5.0_08.msi allusers=1 REBOOT=Suppress CUSTOM=1 IEXPLORER=1 MOZILLA=1 NETSCAPE6=1 JAVAUPDATE=0 ADDLOCAL=ALL">
<exit code="0"/>
</install>
<remove cmd="MsiExec.exe /q /x{3248F0A8-6813-11D6-A77B-00B0D0150080} REBOOT=Suppress"/>
<upgrade cmd=""/>
</package>
<package id="ntp-client" name="ntp client configuration" revision="2" reboot="false" priority="1" execute="once">
<install cmd="%SOFTWARE%\pkg\ntp\install.bat"/>
<upgrade cmd="%SOFTWARE%\pkg\ntp\install.bat"/>
<remove cmd="%SOFTWARE%\pkg\ntp\uninstall.bat"/>
</package>
<check type="uninstall" condition="exists" path="Adobe Reader 8.1.2 - Deutsch"/>
<install cmd="msiexec /q /i "%SOFTWARE%\pkg\adobe\AcroRead.msi" allusers=1">
<exit code="0"/>
</install>
<remove cmd="MsiExec.exe /q /x{AC76BA86-7AD7-1031-7B44-A70500000002}"/>
<upgrade cmd="msiexec /q /i "%SOFTWARE%\pkg\adobe\AcroRead.msi" allusers=1">
<exit code="0"/>
<exit code="3010"/>
</upgrade>
</package>
><package id="ReportViewer" name="Microsoft Report Viewer Redistributable 2008" revision="2" reboot="false" priority="10">
<check type="uninstall" condition="exists" path="Microsoft Report Viewer Redistributable 2008"/>
<install cmd="%SOFTWARE%\pkg\wsus\ReportViewer.exe /q">
<exit code="0"/>
</install>
<remove cmd="%SOFTWARE%\pkg\wsus\ReportViewer.exe /qu"/>
</package>
<package id="jre" name="Java Runtime Environment 1.5.0_08" revision="1" reboot="true" priority="2">
<check type="uninstall" condition="exists" path="J2SE Runtime Environment 5.0 Update 8"/>
<install cmd="msiexec /q /i %SOFTWARE%\pkg\java\jre1.5.0_08.msi allusers=1 REBOOT=Suppress CUSTOM=1 IEXPLORER=1 MOZILLA=1 NETSCAPE6=1 JAVAUPDATE=0 ADDLOCAL=ALL">
<exit code="0"/>
</install>
<remove cmd="MsiExec.exe /q /x{3248F0A8-6813-11D6-A77B-00B0D0150080} REBOOT=Suppress"/>
<upgrade cmd=""/>
</package>
<package id="ntp-client" name="ntp client configuration" revision="2" reboot="false" priority="1" execute="once">
<install cmd="%SOFTWARE%\pkg\ntp\install.bat"/>
<upgrade cmd="%SOFTWARE%\pkg\ntp\install.bat"/>
<remove cmd="%SOFTWARE%\pkg\ntp\uninstall.bat"/>
</package>
und den bereich will ich löschen:
<package id="jre" name="Java Runtime Environment 1.5.0_08" revision="1" reboot="true" priority="2">
<check type="uninstall" condition="exists" path="J2SE Runtime Environment 5.0 Update 8"/>
<install cmd="msiexec /q /i %SOFTWARE%\pkg\java\jre1.5.0_08.msi allusers=1 REBOOT=Suppress CUSTOM=1 IEXPLORER=1 MOZILLA=1 NETSCAPE6=1 JAVAUPDATE=0 ADDLOCAL=ALL">
<exit code="0"/>
</install>
<remove cmd="MsiExec.exe /q /x{3248F0A8-6813-11D6-A77B-00B0D0150080} REBOOT=Suppress"/>
<upgrade cmd=""/>
</package>
<check type="uninstall" condition="exists" path="J2SE Runtime Environment 5.0 Update 8"/>
<install cmd="msiexec /q /i %SOFTWARE%\pkg\java\jre1.5.0_08.msi allusers=1 REBOOT=Suppress CUSTOM=1 IEXPLORER=1 MOZILLA=1 NETSCAPE6=1 JAVAUPDATE=0 ADDLOCAL=ALL">
<exit code="0"/>
</install>
<remove cmd="MsiExec.exe /q /x{3248F0A8-6813-11D6-A77B-00B0D0150080} REBOOT=Suppress"/>
<upgrade cmd=""/>
</package>
regex: (<package id="jre" name="Java Runtime Environment 1.5.0_08".*\s+.*\s+.*\s+.*\s+.*\s+.*\s+.*\s+.*)
ich würde es gerne so lösen:
regex: (<package id="jre" name="Java Runtime Environment 1.5.0_08".*\s+.*<\/package>)
hoffe hier kann mir jemand helfen.
gruß michael
Please also mark the comments that contributed to the solution of the article
Content-ID: 163937
Url: https://administrator.de/contentid/163937
Printed on: December 2, 2024 at 21:12 o'clock
2 Comments
Latest comment
Hallo Michael,
ich nehme an, dass Du mit
"soweit klappt es nur das alles bis zum letzten </package> gelöscht wird.
alles was zwischen "<package id="jre" name="Java "" und "</package>"."
sagen wolltest, dass der reguläre Ausdruck nicht richtig funktioniert, weil er nicht nur bis zum nächsten "</package>"-Element alles löscht, sondern alles bis zum letzten Auftauchen von "</package>" im Text.
Um dieses "gierige" Verhalten von Quantifiern (*,+) zu ändern, kann man in Perl ein Fragezeichen hinter den Quantifier stellen:
$text =~ s/(<package id="jre" name="Java Runtime Environment.*?<\/package>)//ms;
Ich habe es probiert und es funktioniert.
ich nehme an, dass Du mit
"soweit klappt es nur das alles bis zum letzten </package> gelöscht wird.
alles was zwischen "<package id="jre" name="Java "" und "</package>"."
sagen wolltest, dass der reguläre Ausdruck nicht richtig funktioniert, weil er nicht nur bis zum nächsten "</package>"-Element alles löscht, sondern alles bis zum letzten Auftauchen von "</package>" im Text.
Um dieses "gierige" Verhalten von Quantifiern (*,+) zu ändern, kann man in Perl ein Fragezeichen hinter den Quantifier stellen:
$text =~ s/(<package id="jre" name="Java Runtime Environment.*?<\/package>)//ms;
Ich habe es probiert und es funktioniert.