PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : perl eine zeile auslesen und ggf ändern



Chakotay
04-08-2006, 19:34
ich möchte aus einer text datei den wert einer bestimmten zeile (zeile 2) auslesen
in der zeile 2 kann nur (on) oder (off) stehen (weil in jeder zeile nur eins von beidem steht^^)

wenn da on steht soll er das on aus der datei in der zeile 2 löschen und stattdessen ein off reinschreiben / speichern

wenn in der zeile 2 off steht soll er ein on draus machen (das ganze wird später über ein button gesteuert und soll das einzelnen an und ausschalten von scripts aus meiner sammlung ermöglichen)

das auslesen hab ich mir schon zusammen gebastelt aus vorherigen tips von diesem board hier ;-)

nur das ersetzen des wortes in der zeile 2 macht mir noch kummer :(

hier schonmal mein ansatz



my $HOME = Xchat::get_info("xchatdir");
my $CS_MODULE = "$HOME/CS-MODULE";
my $LOAD_CONF = "$CS_MODULE/ChakoLoad.conf";

open(ALT,"<$LOAD_CONF") ;
my @Lines = <ALT> ;
close(ALT) ;

for ($i = 0; $i <= $#Lines; $i++)
{
if($i =~ /1/){
chomp($Lines[$i]);
IRC::print("Zeile $i ist gleich: $Lines[$i] !");
}
}

Romanday
04-08-2006, 22:09
wenn da on steht soll er das on aus der datei in der zeile 2 löschen und stattdessen ein off reinschreiben / speichern


if/else + Konkatenation anschauen.
Wie liest und schreibt man Dateien....
Finde doch mal heraus, wo und wie die Zeile gespeichert ist.

Du hast alles schon da, mußt es nur mal mit print ausgeben.
(Wir sind kein Hausaufgaben Forum! :D)

Chakotay
04-08-2006, 23:10
ich versteh nicht ganz wie du auf hausaufgaben kommst

und das ersetzten ist auch nicht das prob (s/on/off/;)

ich habs auch schon mit

system("cat $LOAD_CONF | sed s/on/off/g >> $LOAD_CONF");

versucht
was allerdings nicht die zeile ersetzt sondern nur unten dran schreibt

ich weiss einfach nicht wie ich ihn davon überzeuge es in die textdatei zu ersetzten

Romanday
05-08-2006, 07:05
ich weiss einfach nicht wie ich

ihn

davon überzeuge es in die textdatei zu ersetzten

Oh, er ist männlich.:D

Na das einfachste ist doch anhand eines Filters die Datei neu
zu schreiben.

Damit sollte es gehen:
http://de.selfhtml.org/perl/funktionen/einausgabe.htm

Chakotay
05-08-2006, 09:29
ok

ausser zusätzlicher verwirrung hat das nix gebracht

ich weiss durch diese seite immer noch nicht wie ich mein script in der textdatei nur in der zeile 2 nach dem wort "on" suchen und dieses durch das wort "off" ersetzten lasse mit anschliessendem schreiben auf die hdd

jeebee
05-08-2006, 14:33
ich habs auch schon mit

system("cat $LOAD_CONF | sed s/on/off/g >> $LOAD_CONF");

versucht
was allerdings nicht die zeile ersetzt sondern nur unten dran schreibt

kein Wunder, wenn du den Operator >> (an die Datei anhängen) brauchst. Versuchs mal mit
system("cat $LOAD_CONF | sed s/on/off/g > $LOAD_CONF");
der Operator > löscht die alte Datei und legt sie neu an.
Ach ja, mit Perl gäbs wohl auch elegantere Lösungen.

michael.sprick
05-08-2006, 17:30
kein Wunder, wenn du den Operator >> (an die Datei anhängen) brauchst. Versuchs mal mit
system("cat $LOAD_CONF | sed s/on/off/g > $LOAD_CONF");


Das würde nur dann funktionieren, wenn _alle_ Vorkommen von "on" gegen "off" ersetzt werden sollen.
Wenn ich ihn richtig verstanden habe, sieht die Datei etwa so aus:



on
on
off
off
on
...


Im Prinzip gibt es zwei Möglichkeiten.
1. Du liest die komplette Datei in ein Array ein, änderst dann die gewünschte Zeile und schreibst die komplette Datei wieder neu.

2. Du findest die Position von Zeile n und schreibst genau an diese Stelle "on" bzw. "off". Du änderst also nur die Zeile - schreibst nicht die ganze Datei neu.

Die zweite Lösung ist etwas umständlicher und nur dann nötig, wenn die Datei sehr groß ist.

Eine Möglichkeit das zu machen wäre diese:



#!/usr/bin/perl

use strict;
use warnings;

my $filename = "test.txt"; #Name der zu ändernden Datei
my $changeline = 2; # ändern von Zeile n (angefangen bei 1)

open(FH,"+<$filename"); # Datei im Schreib-/Lesemodus öffnen
my $lineno=0;

while(my $line = <FH>)
{
$lineno++;
if($lineno == $changeline) # wenn Zeile gefunden, dann
{
# gehe an Zeilenanfang
seek(FH,tell(FH) - length($line),0);

# setze den neuen Wert
my $NewValue =($line =~ /^off/) ? "on \n" : "off\n";

#überschreibe die Zeile mit dem neuen Wert
print FH $NewValue;

# Schleife beenden
last;
}
}

close(FH);



hth, michael

Chakotay
05-08-2006, 20:22
supie danke (so versteh dann auch ich das :-D ) ^^sry wenn ich manchmal etwas schwerer von kapee bin^^

hab jetzt einfach mal my $changeline = shift; geändert damit ich dieses sciptteil nicht für jede zeile neu schreiben muss ^^

nu hab ich aber nen kleinen bug und weiss einfach nicht worans liegt

ab und an mal
völlig willkürlich und ohne ersichtlichen grund ändert er zusätzlich zu der gewünschten zeile
aus der darunterliegenden zeile das erste o in nix
also
ändern von zeile 2 off in on

on
on
ff
off
...

liegt das mein meinem shift ???

---
edit

kann man dem script dann nicht eig auch sagen das in der textdatei an einer bestimmten stelle angefangen und aufgehöhrt wird
und vor bzw hinter den markierungen die datei ignoriert wird
also

on
off
###ANFANG-AN-AUS###
on
on
off
###ENDE-AN-AUS###
hier was anderes^^
---
oder währe das was ganz anderes ? / umstäntlicher als ich mir das gerade denke?