bash/sed: TEXT ersetzen durch Ergebnis eines Perl-Scripts



  • Ich schon wieder mit 'ne Scriptfrage. 🙂
    Ich möchte in einer HTML-Datei alle EMail-Adressen in Hex umwandeln, um eine zusätzliche Hürde für Adress-Harvester einzubauen. Für das Umwandeln habe ich ein kleines Perlscript gefunden, das Ersetzen wollte ich jetzt mit sed erledigen.

    Die Frage ist, (wie) kann ich beim sed -e s/PATTERN1/PATTERN2/g statt PATTERN2 das Perl-Script aufrufen und PATTERN1 als Argument übergeben, so dass im Endeffekt PATTERN1 durch das Resultat des Perl-Scripts ersetzt wird?

    Für alternative Vorschläge zur Umwandlung in Hex bin ich natürlich auch offen.

    Danke!



  • SRC="...";
    DST=`perlscript $SRC`;
    sed "s/$SRC/$DST/g"
    

    aber dafür noch sed zu nehmen wo eh schon perl dabei ist... da würde ich das doch gleich komplett in perl machen.



  • Danke, auch wenn es es so einfach wohl doch nicht ist.

    PATTERN1 ist ein regulärer Ausdruck, mit dem ich dynamisch die Mailadressen herausfische. Wenn ich diesen Ausdruck an SRC übergebe dann bekomme ich vom Perlscript ja den Ausdruck in Hex zurück, nicht die Mailadresse in Hex.
    Ich hatte eher an eine backreference gedacht, \1 enthält ja die Mailadresse. Allerdings weiss ich halt nicht, wie ich das an das Perlscript übergeben soll. So funktioniert's jedenfalls nicht.

    cat /tmp/test.htm | sed "[b]s/[/b]mailto:\(.*\)\">[b]/[/b]mailto:`./makehex.pl \1`\">[b]/g[/b]" > /var/www/web1/html/test.htm;
    

    Und komplett in Perl habe ich es nicht versucht, weil ich davon noch weniger Ahnung habe. 🙂
    Falls sich jemand berufen fühlen sollte, das "mal eben" in Perl zu implementieren, hier ist der Code von makehex.pl:

    #! /usr/bin/perl
    
    # Little perl program to convert ascii email addresses to hex
    ## to avoid spam harvesting from mailto: tags
    
    my $addr = shift or die "usage: $0 email\@address.dom\n";
    $addr =~ s/(.)/ sprintf('%%%2x',ord($1)) /ge;
    chomp($addr);
    print "$addr\n";
    


  • Ich würde das auch einfach mit Perl machen; die Ersetzung findet hier statt:

    $addr =~ s/(.)/ sprintf('%%%2x',ord($1)) /ge;
    

    Wenn Du daraus jetzt sowas machst:

    $addr =~ s/mailto:(.)/mailto: sprintf('%%%2x',ord($1)) /ge;
    

    dann sollte das eigentlich klappen.



  • Wie gesagt, von Perl habe ich keine Ahnung, deshalb komme ich hier nicht weiter.

    #! /usr/bin/perl -w
    
    use strict;
    use IO::File;
    
    my $file_handle;
    my $file_name = $ARGV[0] or die "usage: $0 filename\n";
    my $line;
    
    # validate file
    die "File not found: $file_name"
        unless -f $file_name;
    
    # open file
    $file_handle = new IO::File $file_name
        or die "Could not open file ($file_name) $!";
    
    # work with the lines
    while( defined( $line = $file_handle->getline() ) )
    {
        $line =~ s/"mailto"/"HALLO"/ge; # mal so als Test
        printf "%s", $line; # gibt den unveränderten Inhalt der Zeile aus
    }
    

    Vieleicht habt ihr ja noch einen Tip für mich.



  • open FILE, $ARGV[0] or die "Could not open file ($ARGV[0]) $!";
    
    while(defined($line=<FILE>)) {
        $line=~s/mailto/HALLO/ge; # mal so als Test
        print $line;
    }
    

    So ähnlich?


Anmelden zum Antworten