Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Suchen und ersetzen über mehrere zeilen (awk oder sed)

Frage Entwicklung Batch & Shell

Mitglied: micneu

micneu (Level 2) - Jetzt verbinden

04.04.2011, aktualisiert 19:33 Uhr, 5783 Aufrufe, 2 Kommentare

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>

01.
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:
01.
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
Mitglied: micneu
05.04.2011 um 11:46 Uhr
hallo leute,

ich habe etwas gesucht und sowas gefunden:

01.
#!/usr/bin/perl -w 
02.
 
03.
open(INFILE, "<test.xml") or die "Can't open input.txt: $!"; 
04.
open(OUTFILE, ">output.txt") or die "Can't open output.txt: $!"; 
05.
 
06.
my $string = do { local $/; <INFILE> }; 
07.
my $text = $string; 
08.
$text =~ s/(<package id="jre" name="Java Runtime Environment.*<\/package>)//ms; 
09.
print OUTFILE $text; 
10.
close INFILE; 
11.
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
Bitte warten ..
Mitglied: DauDau
29.06.2011 um 12:36 Uhr
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.
Bitte warten ..
Ähnliche Inhalte
Datenbanken
gelöst MSSQL Datenkonvertierung 1 Zeile auf mehrere Zeilen - bitte um Tips (4)

Frage von highmoe zum Thema Datenbanken ...

Datenbanken
gelöst MS Access: Mehrere Zeilen in einer Zelle zusammenfassen (3)

Frage von User1000 zum Thema Datenbanken ...

Batch & Shell
gelöst Suchen ersetzen mit Sonderzeichen (2)

Frage von GNLen1 zum Thema Batch & Shell ...

Neue Wissensbeiträge
Drucker und Scanner

Samsung SL-M4025ND, firmware update und (kompatible) Tonerkassetten

(1)

Erfahrungsbericht von markus-1969 zum Thema Drucker und Scanner ...

Router & Routing

PfSense auf Supermicro Intel Xeon D-15x8 SoC Bare Bone

Tipp von Dobby zum Thema Router & Routing ...

Windows Server

Exchange 2010 auf Windows Server 2016 und AD

(2)

Tipp von Herbrich19 zum Thema Windows Server ...

KVM

How to: Libvirt Port forwarding

(2)

Anleitung von fundave3 zum Thema KVM ...

Heiß diskutierte Inhalte
Router & Routing
über Vmware auf eine FritzBox mit IPv6 per VPN (17)

Frage von Zockervogel zum Thema Router & Routing ...

Basic
Programmierung von Windows Programmen (8)

Frage von Ghost108 zum Thema Basic ...