Ich habe eine sed Befehl, den ich auf eine riesige, schreckliche, hässliche HTML-Datei, die aus einem Microsoft Word-Dokument erstellt wurde, ausführen möchte. Alles, was sie tun sollen, ist eine Instanz der Zeichenfolge entfernenEin beliebiges Zeichen (einschließlich Zeilenumbrüche) in sed
style='text-align:center; color:blue;
exampleStyle:exampleValue'
Der sed Befehl, den ich ist
sed "s/ style='[^']*'//" fileA > fileB
Es funktioniert großartig, mit der Ausnahme, dass zu ändern versuchen, wann immer es eine neue Linie innerhalb dem ist passender Text, stimmt nicht überein. Gibt es einen Modifikator für sed oder etwas, das ich tun kann, um die Übereinstimmung eines beliebigen Zeichens zu erzwingen, einschließlich Zeilenumbrüchen?
Ich verstehe, dass Regexps bei XML und HTML schrecklich sind, blah blah blah, aber in diesem Fall sind die String-Muster wohlgeformt, da die Style-Attribute immer mit einem einfachen Zitat beginnen und mit einem einzigen Zitat enden. Wenn ich also nur das Newline-Problem lösen könnte, könnte ich die HTML-Größe mit nur einem Befehl um mehr als 50% reduzieren.
Am Ende stellte sich heraus, dass Sinan Ünürs Perl-Skript am besten funktionierte. Es war fast augenblicklich und reduzierte die Dateigröße von 2,3 MB auf 850 KB. Good ol 'Perl ...
sed ist linienbasiert. Das ist der wichtigste Haltepunkt hier.Wenn Sie den Modifikator/g regex verwenden, gibt es möglicherweise eine Befehlszeilenoption, um die Datei als einzelne Zeile zu lesen, aber ich bezweifle es (Speicherprobleme und ähnliches) –
Es gibt keine Option (die ich kenne) zum Lesen einer Datei als einzelne Zeile. Ich würde Perl dafür benutzen. – Dana
Aber sed hat Mittel, um neue Zeilen in den Musterbereich und den Haltebereich einzufügen, so dass es möglich ist, in sed mehrere Zeilen zu verarbeiten - es ist einfach nicht hübsch. – Beano