unixforum.net - Der Treffpunkt für UNIX Fans Der Treffpunkt für UNIX Fans seit 2002
  Übersicht   Forum   Hilfe Suche Einloggen Registrieren   *
Suche
Google
Erweiterte Suche
Willkommen Gast. Bitte einloggen oder registrieren.
22. Mai 2012, 19:19:55

Einloggen mit Benutzername, Passwort und Sitzungslänge
Letzte 5 Shouts:
31. Dezember 2011, 22:28:22
Dann mal einen guten Rutsch!

Greez aus der Noris
25. September 2011, 08:05:05
Gute Besserung!
07. September 2011, 14:20:51
An diesem Tag hattest du also kein(en) Plan. Wink
04. September 2011, 19:04:39
ja, genau die. Bei mir war der Server wohl genau diesen Tag down. Alternative:
http://lsub.org/sys/src
01. September 2011, 20:10:10
Spenden
Berechtigungen

Anzeige
Anzeige
Seiten: [1]   Nach unten
  Drucken  
Autor Thema: schreibblockade perl script  (Gelesen 1833 mal)
linuxdomination
Unix Bachelor
***
Offline Offline

Beiträge: 214



Profil anzeigen WWW
« am: 17. Juni 2008, 14:08:42 »

hi, folgendes hab ich zusammengedoktert->

Code:
#!/usr/bin/perl

if ($#ARGV != 2) {
    print "usage: edit_cron.pl <find> <replace> <file>\n";
    exit;
}


my $find        = $ARGV[0];
my $replace  = $ARGV[1];
my $path    = $ARGV[2];


open (IN, "$path") || die $!;
open (OUT, ">$path.bak") || die $!;

while (<IN>) {
s/$find/$replace/g;
print OUT;
}
close IN;
close OUT;

leider macht das teil eigentlich gar nichts, komm aber leider auch auf keinen grünen zweig mehr. ich will eigentlich nur in der crontab oder anderen textfiles unter angabe des pfades, und der search/replace parameter strings austauschen.
irgendjemand input dazu?

Gespeichert
unixforum.net - Der Treffpunkt für UNIX Fans
« am: 17. Juni 2008, 14:08:42 »

 Gespeichert
karakal
Unix Master
****
Offline Offline

Beiträge: 457



Profil anzeigen
« Antworten #1 am: 18. Juni 2008, 11:56:24 »

Äh, ich weiß ja wirklich nicht, was du da genau machen willst, aber probiere es mal damit:

Code: (bash)
perl -pi -e 's/<find>/<replace>/g' <FILENAME>

Das ist ein flotter Einzeiler und funktioniert auch net schlecht....

Also zum Beispiel:

Jan 1234
Jan 3456
Mar 1234

perl -pi -e 's/Jan/Feb/g' date.txt

wird

Feb 1234
Feb 3456
Mar 1234
Gespeichert
klicman
Unix Rookie
*
Offline Offline

Beiträge: 3


Profil anzeigen
« Antworten #2 am: 19. Juni 2008, 00:19:31 »

Hallo,

einen schönen Gruss erst mal aus dem mood-indigo. Ich habe mich hier gerade erst angemeldet,
und noch nicht vorgestellt, aber das hole ich bei Gelegenheit nach.

Anyway, ich verstehe dein Problem nicht; soweit ich das hier sehen kann (ich habe es einfach mal mit Perl 5.8.8
unter Linux 2.6.16.13-4-smp ausprobiert), funktioniert dein Skript wie erwartet: du liest aus der Datei $path, ersetzt
$find durch $replace und schreibst das Ergebnis nach $path.bak.

Der Aufruf
Code:
% edit_cron.pl Jan Feb date.txt
liefert das erwartete Ergebnis in date.txt.bak.

Auch
Code:
% edit_cron.pl 'Jan 1234' 'Feb 9876' date.txt
funktioniert mit dem Testbeispiel von karakal wie erwartet.

Kannst Du mir dein Problem mit einem konkreten (Aufruf-)Beispiel genauer erläutern?

Gruss aus Köln,
Peter
Gespeichert
linuxdomination
Unix Bachelor
***
Offline Offline

Beiträge: 214



Profil anzeigen WWW
« Antworten #3 am: 19. Juni 2008, 06:15:52 »

...ich will einfach nur cronab entries auskommentieren, z.b so ->

Code:

#./edit_cron.pl '00 01 * * * /opt/RRZ/SunOS/sh/start.sh /opt/RRZ/SunOS/sh/daily.sh &' '# 00 01 * * * /opt/RRZ/SunOS/sh/start.sh /opt/RRZ/SunOS/sh/daily.sh &' '/home/wrztrc/crontest'


in diesen fall macht das script leider genau gar nichts, das file verbleibt unmodifiziert. denke mal das das in den sonderzeichen in den strings liegt. hab keinen plan wie das mit regex zu handlen ist.

hab auch ne andere variante versucht ...

Code:
#!/usr/bin/perl

if ($#ARGV != 2) {
    print "usage: edit_cron.pl <find> <replace> <file>\n";
    exit;
}


my $find        = $ARGV[0];
my $replace  = $ARGV[1];
my $path    = $ARGV[2];


        open FILE, "+<$path"
               or die "Cannot open $name: $!";
           flock FILE, 2;
            @data = $find , <FILE>;
            seek FILE, 0, 0;
           print $replace @data;
          close FILE;

ebenfalls leider erfolglos  Cry

Code:
xsctep01:/home/wrztrc>perl -v

This is perl, v5.8.4 built for sun4-solaris-64int
« Letzte Änderung: 19. Juni 2008, 06:23:02 von linuxdomination » Gespeichert
klicman
Unix Rookie
*
Offline Offline

Beiträge: 3


Profil anzeigen
« Antworten #4 am: 19. Juni 2008, 07:30:01 »

Ja, so etwas habe ich mir schon gedacht...

Du musst im $find-String (und nur im $find-String) den Sternchen Backslashes voranstellen,
da diese im Suchteil von s/// nicht für das literale '*' stehen, sondern als Regex-Modifier
("null oder mehr Vorkommen von x") interpretiert werden:

So funktionierts:

Code:
                       !  !  !
#./edit_cron.pl '00 01 \* \* \* /opt/RRZ/SunOS/sh/start.sh /opt/RRZ/SunOS/sh/daily.sh &' '# 00 01 * * * /opt/RRZ/SunOS/sh/start.sh /opt/RRZ/SunOS/sh/daily.sh &' '/home/wrztrc/crontest'

Gruss,
Peter
Gespeichert
unixforum.net - Der Treffpunkt für UNIX Fans
« Antworten #4 am: 19. Juni 2008, 07:30:01 »

 Gespeichert
linuxdomination
Unix Bachelor
***
Offline Offline

Beiträge: 214



Profil anzeigen WWW
« Antworten #5 am: 19. Juni 2008, 13:25:49 »

so jetzt ists gut, die finale version ->

Code:
#!/usr/bin/perl

if ($#ARGV != 2) {
    print "usage: edit_file.pl <find> <replace> <file>\n";
    print "Escape any special characters in the find string, or the task will fail!\n";
    print "You have been warned.\n";
    exit;
}


my $find        = $ARGV[0];
my $replace  = $ARGV[1];
my $path    = $ARGV[2];

        open IN, "<$path"
          or die "Cannot open: $!";
        open OUT, ">$path.bak"
          or die "Cannot create: $!";
        while (<IN>) {
            s/$find/$replace/g;
            print OUT;
        }
        close IN;
        close OUT;
        rename "$path.bak", $path
          or die "Cannot rename: $!";

    if ($path =~ m/cron/) {
           system ('crontab $path');
     } else {

  die;
}

danke für den arschtritt  Wink
Gespeichert
klicman
Unix Rookie
*
Offline Offline

Beiträge: 3


Profil anzeigen
« Antworten #6 am: 19. Juni 2008, 14:47:52 »

Na, als Arschtritt will ich das natürlich nicht verstanden wissen. Smiley Nur als Lösung deines Problems...

Noch zwei Anmerkungen:

- die Variable $0 enthält den Programmnamen. Dein Nutzungshinweis bleibt damit immer aktuell.

- Für den Benutzer wäre es natürlich schöner, wenn das Programm das Escaping selbst übernimmt,
also so etwas in der Richtung

Code:
...
$find=~s/\*/\\*/g;
...

(um mal bei diesem Beispiel zu bleiben).

Gruss,
Peter
Gespeichert
Seiten: [1]   Nach oben
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC
TinyPortal v0.9.8 © Bloc
Prüfe XHTML 1.0 Prüfe CSS
sonnenblen.de, mood-indigo.org, unixforum.net und realcomputers.org sind Projekte der steinbruch.info GbR

Google war zuletzt hier 10. Mai 2012, 00:55:54