|
JaiBee
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

23. Februar 2009 14:13
Hallo, aus einer Textdatei soll mit sed folgende Passage gelöscht werden: var custom = prefs.getCharPref('CustomPage[246]');
var customId = 'em_ubuntuusersmenu_' + number + '_c[246]';
if (custom == '')
win.document.getElementById(customId).setAttribute('hidden', true);
else
win.document.getElementById(customId).setAttribute('hidden', false);
Es sind insgesamt 3 Blöcke, jeweils mit CustomPage2, CustomPage4 oder CustomPage6 (das selbe gilt auch für c2, c4, c6). Ich weiß leider nicht, wie man diese mehrzeiligen Blöcke definiert . Vielen Dank! Gruß JaiBee EDIT: Titel verändert
|
|
willnix
Anmeldungsdatum: Juni 2, 2008
Beiträge: 14
|

23. Februar 2009 16:26
Da sed eigentlich Zeilenweise arbeitet ist mir keine elegante Möglichkeit bekannt.
Wenn ich vor solch einem Problem stehe helfe ich mir immer damit aus, dass ich die Zeilenumbrüche zu erst mit einem Platzhalter ersetze dann meine Änderungen vornehme und zum Schluss den Platzhalter wieder mit Zeilenumbrüchen überschreibe. Also etwa so:
sed 's/\n/%%ZEILENUMBRUCH%%/g' | sed 's/Musterübermehrere%%ZEILENUMBRUCH%%Zeilenhinweg//g' | sed 's/%%ZEILENUMBRUCH%%/\n/g'
Ich hoffe das ist halbwegs verständlich.
mfg
Willnix
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

23. Februar 2009 16:29
Ok danke. Werde ich mal ausprobieren. Es muss übrigens nicht unbedingt mit sed sein (muss aber Shell-Skript geeignet sein, also kein Java etc.). Gruß JaiBee EDIT: Bekomme es leider nicht hin 
|
|
willnix
Anmeldungsdatum: Juni 2, 2008
Beiträge: 14
|

24. Februar 2009 00:12
Kannst du nochmals genau schildern was du nicht hinbekommst?
|
|
svenXY
Anmeldungsdatum: Sept. 22, 2008
Beiträge: 541
Wohnort: Heidelberg
|

24. Februar 2009 09:53
perl-statt-sed.pl:
1
2
3
4
5
6
7
8
9
10 | while (<>) {
if (/var custom = prefs.getCharPref\('CustomPage[246]'/) { # suche Startzeile
for (1..5) { # ignoriere nächste 5 Zeilen
my $crap = <>;
}
}
else {
print; # andernfalls gebe Zeile aus
}
}
|
und dann
perl perl-statt-sed.pl < quelldatei > zieldatei
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

24. Februar 2009 13:22
willnix schrieb: Kannst du nochmals genau schildern was du nicht hinbekommst?
Ich weiß nicht, wie ich das eingeben muss. Entweder bekomme ich nur die Datei in der Konsole ausgegeben oder es tut sich nichts: 1
2
3 | COMMON="$DIR/em_ubuntuusers-menu_$V/chrome/content/em_ubuntuusersmenu/common.js"
sed -i 's/\n/%%ZEILENUMBRUCH%%/g' $COMMON | sed -i 's/var custom = prefs.getCharPref('CustomPage2');%%ZEILENUMBRUCH%%var customId = 'em_ubuntuusersmenu_' + number + '_c2';%%ZEILENUMBRUCH%%if (custom == '')%%ZEILENUMBRUCH%% win.document.getElementById(customId).setAttribute('hidden', true);%%ZEILENUMBRUCH%%else%%ZEILENUMBRUCH%% win.document.getElementById(customId).setAttribute('hidden', false);//g' $COMMON | sed -i 's/%%ZEILENUMBRUCH%%/\n/g' $COMMON
|
Ich habe zwar schon ein paar mal mir sed gearbeitet, jedoch verstehe ich die Syntax immer noch nicht wirklich.
svenXY schrieb: perl-statt-sed.pl:
1
2
3
4
5
6
7
8
9
10 | while (<>) {
if (/var custom = prefs.getCharPref\('CustomPage[246]'/) { # suche Startzeile
for (1..5) { # ignoriere nächste 5 Zeilen
my $crap = <>;
}
}
else {
print; # andernfalls gebe Zeile aus
}
}
|
und dann
perl perl-statt-sed.pl < quelldatei > zieldatei
Das sieht auch nicht schlecht aus. Jedoch habe ich keine Quell- & Zieldatei (sondern nur eine). Wie muss ich das Skript dann ausführen? Vielen Dank! Gruß JaiBee
|
|
svenXY
Anmeldungsdatum: Sept. 22, 2008
Beiträge: 541
Wohnort: Heidelberg
|

24. Februar 2009 15:51
JaiBee schrieb: svenXY schrieb: perl perl-statt-sed.pl < quelldatei > zieldatei
Das sieht auch nicht schlecht aus. Jedoch habe ich keine Quell- & Zieldatei (sondern nur eine). Wie muss ich das Skript dann ausführen?
dann muss das ein wenig anders aussehen: 1
2
3
4
5
6
7
8
9
10
11 | use strict;
use warnings;
if (/var custom = prefs.getCharPref\('CustomPage[246]'/) {
for (1..5) {
my $crap = <>;
}
}
else {
print;
}
|
und dann
perl -ni perl-statt-sed.pl quelldatei.txt Mit -ni (siehe auch perldoc perlrun) kannst Du eine Inline-Änderung in der Datei machen. Da aber -n den while(<>) - loop bereits implizit mit drin hat, ist der nun überflüssig. Gruss, Sven
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

24. Februar 2009 16:17
svenXY schrieb: dann muss das ein wenig anders aussehen: 1
2
3
4
5
6
7
8
9
10
11 | use strict;
use warnings;
if (/var custom = prefs.getCharPref\('CustomPage[246]'/) {
for (1..5) {
my $crap = <>;
}
}
else {
print;
}
|
und dann
perl -ni perl-statt-sed.pl quelldatei.txt
Klasse, funktionert! Vielen Dank! Noch eine kleine Frage: Kann ich den Pfad zur Quelldatei auch direkt in das Skript hineinschreiben? Gruß JaiBee
|
|
svenXY
Anmeldungsdatum: Sept. 22, 2008
Beiträge: 541
Wohnort: Heidelberg
|

25. Februar 2009 11:12
JaiBee schrieb: Noch eine kleine Frage: Kann ich den Pfad zur Quelldatei auch direkt in das Skript hineinschreiben?
Dann wird das mit dem Inline-editieren aber etwas schwieriger. Dann würde das so aussehen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | #!/usr/bin/perl
use strict;
use warnings;
my $quelldatei = 'quelldatei.txt'; # eventuell mit komplettem Pfad
my @zeilen;
# Datei zum lesen öffnen
open(my $fh, '<', $quelldatei) or die "Konnte $quelldatei nicht oeffnen: $!";
# Zeilenweise lesen
while ( my $zeile = <$fh>) {
# filtern
if ( $zeile =~ /var custom = prefs.getCharPref\('CustomPage[246]'/) {
for (1..5) {
$zeile = <$fh>;
}
}
else {
# Zeilen in Array speichern
push(@zeilen, $zeile);
}
}
close $fh;
# Datei zum schreiben öffnen
open($fh, '>', $quelldatei) or die "Konnte $quelldatei nicht oeffnen: $!";
# Array in Datei schreiben
for my $zeile (@zeilen) {
print $fh $zeile;
}
# Dateihandle schliessen
close $fh;
|
Das wäre aber m.E. umständlicher und weniger flexibel. Gruss, Sven
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

25. Februar 2009 22:24
Das wäre aber m.E. umständlicher und weniger flexibel.
Da hast du vollkommen Recht. Nochmals vielen Dank für deine Tipps! Gruß JaiBee
|