Schrift
[thread]12042[/thread]

Datei zeilenweise einlesen und ändern

Leser: 2


<< >> 7 Einträge, 1 Seite
Gast Gast
 2008-06-18 17:20
#111216 #111216
Hallo,

ich habe einen string, der eine Zeile aus einer Datei enthält, in etwa so:
my $line = copy folder1\subfolder1\file.txt destFolder\fritz\file.txt

Nun würde ich gerne an der Stelle, wo "destFolder" steht eine Ersetzung vornehmen. Also z.B. "destFolder" durch "destinationFolder" ersetzen. Wohl gemerkt kann "desFolder" auch anders heißen.

Hat einer eine Idee, wie ich sowas machen könnte? Bin ziemlich neu in Perl, und mir fällt momentan nicht wirklich etwas ein.

Danke...
nepos
 2008-06-18 17:26
#111217 #111217
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code (perl): (dl )
$line =~ s/destFolder/destinationFolder/;

Das wäre die einfachste, aber sicherlich nicht beste Variante mit s// und Regex.
murphy
 2008-06-18 17:28
#111218 #111218
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Einfach einen regulären Ausdruck darauf anwenden:
Code (perl): (dl )
1
2
3
4
my $line = 'copy folder1\subfolder1\file.txt destFolder\fritz\file.txt';
$line =~ s/destFolder/otherFolder/;

print "$line\n";
When C++ is your hammer, every problem looks like your thumb.
renee
 2008-06-18 17:29
#111220 #111220
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Woher weißt Du, was durch was ersetzt werden muss? Irgendeine Regel muss es geben, denn Perl kann genauso wenig wie andere Sprachen hellsehen...

Ersetzen an Hand Deines Beispiels:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl

use strict;
use warnings;

my $line =  'copy folder1\subfolder1\file.txt destFolder\fritz\file.txt';

# hier kommt das Ersetzen
$line =~ s/destFolder/destinationFolder/;


Den ersten Teil kannst Du durch einen beliebigen Regulären Ausdruck ersetzen, so dass Du bei dem Suchteil sehr flexibel bist.

Lesestoff:

Reguläre Ausdrücke:
* http://regenechsen.de/
* http://perldoc.perl.org/perlre.html
* perldoc perlretut
* perldoc perlreref

s///
* perldoc perlop
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-06-18 20:19
#111241 #111241
Vielen Dank für die Antworten. Ich glaube ich habe mich etwas unklar ausgedrückt, entschuldigung dafür.

Also hier etwas präziser: Die Datei die ich bearbeiten will, ist eine batch-Datei, in der mehrere hundert "copy-Zeilen" stehen. Das Muster ist immer dasselbe, so wie im ersten Beitrag dargestellt. Nur unterscheiden sich eben die Pfade jedesmal. Und ich möchte von dem zweiten Pfad, also dem letzten, das was vor dem ersten Backslash steht, durch irgend etwas anderes ersetzen.

Ich habe mich jetzt nochmal ein bisschen weiter eingelesen denke dass ich das mit "split" hin kriegen könnte. Also die ganze Zeile in "copy", "pfad1", und "pfad2" aufteilen, und dann auf "pfad2" eine Ersetzung vornehmen.

Müsste eigentlich so gehen, oder spricht da etwas dagegen was ich momentan übersehe?

Abgesehen davon: Gäbe es eine Möglichkeit, das selbe einfacher zu erreichen, z.B. mit einem einzigen Ausdruck?

Danke.
MatthiasW
 2008-06-18 21:13
#111244 #111244
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Es geht auch mit nur einem Ausdruck:
Code: (dl )
$str =~ s/^(copy\s+(?:\S+|"[^"]+")\s+"?)zielpfad(.+)$/$1neuerpfad$2/mg;

Vorrausgesetzt in $str ist der gesamte Inhalt der Datei.

Aber ich finde deinen Lösungsweg verständlicher und einfacher, daher würde ich ihn benutzen.
Nur beim split() solltest du aufpassen.
In dem rx den ich oben angegeben habe, habe ich die Möglichkeit offen gelassen, die beiden Dateipfade in Anführungszeichen zu setzen, es könnten sich ja Leerzeichen in den Pfaden befinden.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Gast Gast
 2008-06-19 07:34
#111251 #111251
Code (perl): (dl )
1
2
3
my $zielpfad='nur_ein_test';
my $line = 'copy folder1\subfolder1\file.txt destFolder\fritz\file.txt';
$line=~s!^(copy\s+.+?\.\w+\s+)\w+?(?=\\)!$1$zielpfad!;


Das sollte funktionieren...
<< >> 7 Einträge, 1 Seite



View all threads created 2008-06-18 17:20.