micneu
Goto Top

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:
<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 &quot;%SOFTWARE%\pkg\adobe\AcroRead.msi&quot; allusers=1">
<exit code="0"/>
</install>
<remove cmd="MsiExec.exe /q /x{AC76BA86-7AD7-1031-7B44-A70500000002}"/>
<upgrade cmd="msiexec /q /i &quot;%SOFTWARE%\pkg\adobe\AcroRead.msi&quot; 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>

regex: (<package id="jre" name="Java Runtime Environment 1.5.0_08".*\s+.*\s+.*\s+.*\s+.*\s+.*\s+.*\s+.*)  
wie kann ich das kürzer und flexibler machen?
ich würde es gerne so lösen:
regex: (<package id="jre" name="Java Runtime Environment 1.5.0_08".*\s+.*<\/package>)  
so das ich alles zwischen package.... und \package> finde.

hoffe hier kann mir jemand helfen.

gruß michael

Content-ID: 163937

Url: https://administrator.de/forum/suchen-und-ersetzen-ueber-mehrere-zeilen-awk-oder-sed-163937.html

Ausgedruckt am: 24.12.2024 um 12:12 Uhr

micneu
micneu 05.04.2011 um 11:46:32 Uhr
Goto Top
hallo leute,

ich habe etwas gesucht und sowas gefunden:

#!/usr/bin/perl -w

open(INFILE, "<test.xml") or die "Can't open input.txt: $!";  
open(OUTFILE, ">output.txt") or die "Can't open output.txt: $!";  

my $string = do { local $/; <INFILE> };
my $text = $string;
$text =~ s/(<package id="jre" name="Java Runtime Environment.*<\/package>)//ms;  
print OUTFILE $text;
close INFILE;
close OUTFILE;

soweit klappt es nur das alles bis zum letzten </package> gelöscht wird.
alles was zwischen "<package id="jre" name="Java "" und "</package>".

wie mache ich das.

gruß michael
DauDau
DauDau 29.06.2011 um 12:36:25 Uhr
Goto Top
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.