Nieuws:

Ubuntu-NL weer online!

Na een periode van technische problemen en een overbelaste server zijn we eindelijk weer bereikbaar.
Samen met Hobbynet, onze sponsor en hostingpartner, hebben we een oplossing gevonden zodat alles weer soepel draait.

Bedankt voor jullie geduld en begrip. We hopen nu weer verder te gaan waar we gebleven waren.

Het team van Ubuntu-NL

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Script/programma gezocht  (gelezen 1430 keer)

Script/programma gezocht
« Gepost op: 2007/12/08, 18:01:20 »
Ja daar heb je SeySayux met z'n technische vragen weer. Nee, deze keer is het geen scanner die niet wil scannen tenzij je hem aanzet of een webcam die niet werkt. Ik heb een programma of script nodig dat het volgende  doet:
1) lees een bestand of stdin in
2) zoek todat je $1 (eerste parameter) hebt gevonden, druk alles af todat je aan $2 komt

Nu vroeg ik me af: bestaat er zo'n programma in Linux of heeft misschien hier iemand al een script voor geschreven? Anders zal ik me's verdiepen in de wondere wereld van perl.

Het moet deel uitmaken van een prog waar veel url's worden gebruikt, en url's uit een text gehaald, dus veel regex'en ;).

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Ronnie

  • Lid
    • ronnie.vd.c
Script/programma gezocht
« Reactie #1 Gepost op: 2007/12/08, 19:30:15 »
Ik ben toch bezig met python te leren, dus heb maar ff een scriptje geschreven, probeer maar eens of het werkt.
#!/usr/bin/env python

import sys

for url in sys.stdin:
start = url.find('$1')
end = url.rfind('$2')
print = url[start+2:end]
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Documentatie Terminal

Script/programma gezocht
« Reactie #2 Gepost op: 2007/12/09, 12:52:43 »
Citaat van: Ronnie
Ik ben toch bezig met python te leren, dus heb maar ff een scriptje geschreven, probeer maar eens of het werkt.
#!/usr/bin/env python

import sys

for url in sys.stdin:
start = url.find('$1')
end = url.rfind('$2')
print = url[start+2:end]
2ou dat niet moeten zijn...
#!/usr/bin/env python

import sys

for url in sys.stdin:
start = url.find('$1')
end = url.rfind('$2')
print url[start+2:end]
dus zonder de =?

En ik ken nu geen python, maar ik denk dat het iedere regel apart bekijkt, juist? Ik moet meer zo'n app hebben:

Citaat
Package: aalib
Binary: libaa1-dbg, libaa-bin, libaa1-dev, libaa1
Version: 1.4p5-32
Priority: optional
Section: libs
Maintainer: Joey Hess
Build-Depends: debhelper (>= 5), libslang2-dev, libx11-dev, libxt-dev, libncurses5-dev, libgpmg1-dev | not+linux-gnu, autoconf, libtool (>= 1.3.5), automake1.7, dpkg-dev (>= 1.9.0), texinfo
Architecture: any

....

Package: binutils
Binary: binutils-doc, binutils, binutils-static, binutils-dev, binutils-hppa64, binutils-source, binutils-multiarch, binutils-static-udeb
Version: 2.18-0ubuntu3
Priority: optional
Section: devel
Maintainer: Ubuntu Core developers
Original-Maintainer: James Troup
Build-Depends: dpkg-dev (>= 1.13.9), autoconf (>= 2.13), bison, flex, gettext, texinfo, binutils (>= 2.9.5.0.12), gcc (>= 2.95.2-1), dejagnu (>= 1.4.2-1.1), expect-tcl8.3 (>= 5.32.2-1), dpatch, file, bzip2, lsb-release
Architecture: any
Standards-Version: 3.7.2.0
Format: 1.0
Directory: pool/main/b/binutils
Files:
 253713bd014a16f9ed1f36fa75e6422b 1010 binutils_2.18-0ubuntu3.dsc
 d71b23b4fb91e66802ca2b8f576629f4 19783546 binutils_2.18.orig.tar.gz
 74706082f03ae5ab86a2ffa26a015b2f 97498 binutils_2.18-0ubuntu3.diff.gz
Uploaders: Matthias Klose

...

Standards-Version: 3.7.2
Format: 1.0
Directory: pool/main/z/zsh
Files:
 173da176f51332b35a43b26406b73684 841 zsh_4.3.4-14ubuntu2.dsc
 acc4fc85d18d7f914bb6705775c45bf2 3023668 zsh_4.3.4.orig.tar.gz
 e6f779b14e0fe6d780a913f819d61a8c 213071 zsh_4.3.4-14ubuntu2.diff.gz
Nu zou de app als ik 'binutils' zoek, alles vanaf het begin "Package: binutils" tot aan het einde "Uploaders: ..." moeten afdrukken.

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Ronnie

  • Lid
    • ronnie.vd.c
Script/programma gezocht
« Reactie #3 Gepost op: 2007/12/09, 16:27:34 »
idd, perongelijk een = erbij gezet, goed opgemerkt.
is dit misschien meer wat je zoekt?
# hoe wil je de zoekopdracht binnen krijgen?
search = 'binuntils'

# file vervangen door het bestand met de text
# of packages vervangen door sys.stdin
f = open('file', 'r')
packages = f.readlines()
f.close()

in_package = False

# bekijkt elke regel en print de regels uit package 'search'
for i in packages:
if in_package:
print i
if i[0:9] == 'Uploaders': # misschien moet 9 een 8 worden
in_package = False
elif i == 'Package: ' + search:
in_package = True
zoals je ziet zijn er een aantal dingen nog onduidelijk, zoals de input. Maar daar komen we later wel op.
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Documentatie Terminal

Script/programma gezocht
« Reactie #4 Gepost op: 2007/12/09, 17:17:18 »
Citaat van: Ronnie
idd, perongelijk een = erbij gezet, goed opgemerkt.
is dit misschien meer wat je zoekt?
# hoe wil je de zoekopdracht binnen krijgen?
search = 'binuntils'

# file vervangen door het bestand met de text
# of packages vervangen door sys.stdin
f = open('file', 'r')
packages = f.readlines()
f.close()

in_package = False

# bekijkt elke regel en print de regels uit package 'search'
for i in packages:
if in_package:
print i
if i[0:9] == 'Uploaders': # misschien moet 9 een 8 worden
in_package = False
elif i == 'Package: ' + search:
in_package = True
zoals je ziet zijn er een aantal dingen nog onduidelijk, zoals de input. Maar daar komen we later wel op.
Hmm... Ik wilde als invoer eigenlijk de parameter (args) vanaf de commandolijn, of hoe je dat zegt in Python. Ik heb ondertussen mijn perl weer eens bovengehaald:

# now we gunzipped it, lets do what we actually have to do
@PkgDescr = ();
@AllPkgs = split(/\n/, $SourcesFile);
foreach $line (@AllPkgs) {
  if ($line eq "Package:  $ARGV[0]") {
    $startpush = 1; #begin pushing
  }
  if ($startpush = 1) { push(@PkgDescr, $line); }
  if ($line eq '') {
    $startpush = 0; # stop pushing
  }
}
print @PkgDescr #uiteindelijke versie drukt dit niet af, maar gaat dit verder verwerken
De invoer (van stdin en van Sources.gz), het verwerken (dit + het halen van de bestandnamen en de md5sums hieruit) en de uitvoer (bestanden downloaden) zijn ook al klaar. Hieronder mijn volledige script (onder de GPL v 3)

#!/usr/bin/perl
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
use Compress::Zlib;

if ($#ARGV + 1 != 1 or $ARGV[0] eq '-help' or $ARGV[0] eq '--help' or $ARGV[0] eq '-h') {
  printhelp();
}

sub printhelp {
  print "Usage: spkg packagename\n\n"
  print "This program will help you downloading sources from the Ubuntu\n"
  print "website (or other websites if you modify it). It will download\n"
  print "it, and check it's checksum which it will download too.\n\n"
  print "Copyright (C) 2007  SeySayux\n\n

    This program is free software: you can redistribute it and/or modify\n
    it under the terms of the GNU General Public License as published by\n
    the Free Software Foundation, either version 3 of the License, or\n
    (at your option) any later version.\n\n

    This program is distributed in the hope that it will be useful,\n
    but WITHOUT ANY WARRANTY; without even the implied warranty of\n
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n
    GNU General Public License for more details.\n\n

    You should have received a copy of the GNU General Public License\n
    along with this program.  If not, see .\n"
  exit 0;
}
$SourceSite = 'http://archive.ubuntu.com/ubuntu/'

# now, get the file
$browser = LWP::UserAgent->new();
$browser->timeout(50);
$request = HTTP::Request->new(GET => $SourceSite . 'dists/gutsy/source/Sources.gz');
$response = $browser->request($request);
if ($response->is_error()) {printf "%s\n", $response->status_line; die;}
$SourcesFileGZ = $response->content();

# now we got the file, lets gunzip it!
$buffer;
$gz = undef;
$success = 2;
$SourcesFile ='';

if ($gz = gzopen($infile, "rb")) {
  while ($gz->gzread($buffer) > 0) {
    $SourcesFile . = $buffer;
  }
    if ($gzerrno != Z_STREAM_END) {
      $success = 0;
      print "ZLib Error: $gzerrno: $!\n";
    }
    else {
      $success = 1;
    }
    $gz->gzclose;
  }
else {
   $success = 0;
   print "ZLib Error: opening Sources file - $gzerrno: $!\n";
}

if ($success != 1) {exit 1;}

# now we gunzipped it, lets do what we actually have to do
@PkgDescr = ();
@AllPkgs = split(/\n/, $SourcesFile);
foreach $line (@AllPkgs) {
  if ($line eq "Package:  $ARGV[0]") {
    $startpush = 1; #begin pushing
  }
  if ($startpush = 1) { push(@PkgDescr, $line); }
  if ($line eq '') {
    $startpush = 0; # stop pushing
  }
}
#now all info is in @PkgDescr, so lets get it out of it!
$File; $Patch; $Path; $FileMD5; $PatchMD5
foreach $line (@PkgDescr) {
  if ($line =~ /Directory: /) {
    $Path = $line;
    $Path =~ s/Directory: //g
  }
  if ($line =~ / [a-f0-9]{64} [0-9]+ [a-Z0-9\.-_]+/ ) {
    if ($line =~ /orig/) {
      $FileMD5 = $line
      $FileMD5 =~ s/ \([a-f0-9]{64}\) [0-9]+ \([a-Z0-9\.-_]+\)/\1  \2/;
      $File =~ s/[a-f0-9]  //;
    }
    if ($line =~ /diff/) {
      $PatchMD5 = $line
      $PatchMD5 =~ s/ \([a-f0-9]{64}\) [0-9]+ \([a-Z0-9\.-_]+\)/\1  \2/;
      $Patch =~ s/[a-f0-9]  //;
    }
  }
}

#good, the shell does the rest
exec("wget -nv $SourceSite"."$Path/$File");
exec("echo $FileMD5 | md5sum -c -");
exec("wget -nv $SourceSite"."$Path/$Patch");
exec("echo $PatchMD5 | md5sum -c -");

#that was all, folks!
exit 0;
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Script/programma gezocht
« Reactie #5 Gepost op: 2007/12/09, 19:39:58 »
Euh... weet er iemand hoe je een variabele gunzipt in Perl?
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Script/programma gezocht
« Reactie #6 Gepost op: 2007/12/11, 17:05:07 »
Kheb het af, ga het posten in etalage. Zal deze post editen wanneer ik de link heb.

- SeySayux

EDIT: hier is de link dan http://forum.ubuntu-nl.org/topic/19339
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net