Χρήστης:AtouBot/xml-σελίδες-με-έκφραση.pl

Όνομα εργαλείου: xml-σελίδες-με-έκφραση.pl


Περιγραφή:

Αυτό το εργαλείο διαβάζει κείμενο σε μορφή xml και γράφει στην κονσόλα το περιεχόμενο σελίδων που ικανοποιούν μια κανονική έκφραση. Για να αποθηκευτούν οι σελίδες, πρέπει να κάνετε ανακατεύθυνση με τον κανονικό τρόπο (xml-σελίδες-με-έκφραση.pl > όνομα-αρχείου).

Παράμετροι:

  • --not δείχνει τις σελίδες που δεν ικανοποιούν την έκφραση
  • --noredirs παραβλέπει τις ανακατευθύνσεις
  • η κανονική έκφραση

Προϋποθέσεις:

  • perl

Σημειώσεις χρήσης:

  • Παράδειγμα χρήσης:

cat elwiktionary-20080309-pages-meta-current.xml |./xml-σελίδες-με-έκφραση.pl '{{τ\|[a-z\-]+\|[^}XΧ]+}}( *)\[\[' (βρίσκει συνδέσμους μετά από μεταφράσεις)

  • Περισσότερες πληροφορίες για κανονικές εκφράσεις σύντομα...


→ Πίσω στα Εργαλεία

xml-σελίδες-με-έκφραση.pl επεξεργασία

#!/usr/bin/perl

# γράφουμε όλες τις σελίδες που περιέχουν μια ορισμένη έκφραση

# παράμετροι: 
#   --not       γράφουμε τις σελίδες χωρίς την έκφραση
#   --noredirs  αγνοούμε ανακατευθύνσεις 

# παραδείγματα: 
#  cat elwiktionary-20080309-pages-meta-current.xml |./xml-σελίδες-με-έκφραση.pl  --not '{{=el=}}'
#  cat elwiktionary-20080309-pages-meta-current.xml |./xml-σελίδες-με-έκφραση.pl  '{{PAGENAME}}'

binmode(STDOUT, ":utf8");
binmode(STDIN, ":utf8");

use encoding(UTF8);

$noredirs=0;
$not=0;
$expr="";

$body=0;

sub check_expr {
    my($expr,$not,$noredirs,@text)=@_;
    $pagetype="unknown";
    for $tline (@text) {
	if ($tline =~ /<title>/) {
	    if ($tline !~ /<title>.*:.*<\/title>/) {
		$pagetype="main namespace";
	    }
	    else {
		$pagetype="other";
	    }
	}
	if ($pagetype =~ /other/) {
	    return(0);
	}
	elsif (($tline =~ /#REDIRECT/ig) || ($tline =~ /#ΑΝΑΚΑΤΕΥΘΥΝΣΗ/ig)) {
	    if ($noredirs) {
		return(0);
	    }
	}
	if (($tline =~ /<text/) || ($tline =~ /<\/text/)) {
	    $body=1;
	    $tline =~ s/<(\/)?text[^>]*>//g;
	}
	elsif ($tline =~ /<revision/) {
	    $body=1;
	}
	if (($body == 1) && ($tline =~ /$expr/)) {
	    if ($not) {
		return(0);
	    }
	    else {
		return(1);
	    }
	}
    }
    if ($not) {
	return(1);
    }
    else {
	return(0);
    }
}

while ($opt = shift(@ARGV)) {
    if ($opt =~ /--not/) {
	$not = 1 ;
    }
    elsif ($opt =~ /--noredirs/) {
	$noredirs = 1 ;
    }
    else {
	$expr = $opt;
    }
}

$startpage=0;
while (<STDIN>) {
    $line=$_;
    if ($line =~ /<page>/) {
	$startpage++;
        @text=();
    }
    elsif ($line =~ /<\/page>/) {
	@text=(@text,$line);
    	$startpage=0;
	if (check_expr($expr,$not,$noredirs,@text)) {
	    for my $textline (@text) {
		print "$textline";
	    }
	}
        @text=();
    }
    if ($startpage) {
	@text=(@text,$line);
    }
}

exit(0);