Schrift
[thread]10601[/thread]

Regulärer Ausdruck, Zeilenumbruch

Leser: 1


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Teesemmel
 2007-10-17 13:11
#100954 #100954
User since
2007-10-16
7 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe eine Frage zu den Regulären Ausdrücken.
Folgendes möchte ich mit meinem Skript erreichen. Es soll eine bestimmte Stelle in einer recht umfangreichen Inputdatei (für Abaqus) durchsuchen und an diese Stelle einen Textbaustein einsetzen.
Diese Stelle sieht in etwa so aus:

Code: (dl )
1
2
3
4
5
6
*Elset, elset=KORN_10
232, 259, 260, 261, 286, 287, 288, 289, 290, 313, 314, 315
342, 343, 344, 345, 346, 347, 348, 371, 372, 373, 374, 375
..... und so weiter...
14556, 14557, 14558, 14581, 14582, 14583, 14584, 14585, 14609, 14610
*End Part


So zwischen 14610 und *End Part soll nun mein Textblock. Ich dachte nun ich verwende folgenden RA (nach dem soll dann der BAustein eingefügt werden!):

(\*Elset,\selset=KORN_10)\n((\s*[0-9]*,)*(\s*[0-9]*\n))*

Im Regex Coach funktioniert dieser auch wunderbar, jedoch habe ich in meinem Perl Skript Probleme mit dem Zeilenumbruch. Das Skript schneidet quasi nach *Elset, elset=KORN_10 ab und ignoriert den Zahlenteil danach.

Ich hoffe ich habe mein Problem einigermaßen verständlich dargestellt, evtl. kann mir ja jemand von euch helfen?

Gruß
Max

edit: am ende der zeile steht nie ein komma... sorry, falsch abgetippt
Taulmarill
 2007-10-17 13:18
#100955 #100955
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Hab das ganze nicht getestet, aber was mir spontan auffällt ist, dass deine Zeilen mit den Zahlen meistens mit einem Komma enden. Der Teil des Regex dafür lautet aber (\s*[0-9]*\n). Evtl. währe hier folgendes erfolgreicher (\s*[0-9]*,?\n).
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Teesemmel
 2007-10-17 13:23
#100957 #100957
User since
2007-10-16
7 Artikel
BenutzerIn
[default_avatar]
Sorry, hab den Beitrag nochmal editiert... Also am Ende jeder Zeile steht nie ein Komma. Des Weiteren sind am Anfang jeder Zeile immer Leerzeichen (abhängig von der Größe der Zahl). Das habe ich mit \s* gelöst
renee
 2007-10-17 13:25
#100958 #100958
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum so umständlich??

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my $string = q~*Elset, elset=KORN_10
232, 259, 260, 261, 286, 287, 288, 289, 290, 313, 314, 315
342, 343, 344, 345, 346, 347, 348, 371, 372, 373, 374, 375
..... und so weiter...
14556, 14557, 14558, 14581, 14582, 14583, 14584, 14585, 14609, 14610
*End Part~;

my $text = "Test\n";

$string =~ s/\*End Part/${text}*End Part/;
print $string;
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/
Teesemmel
 2007-10-17 13:27
#100959 #100959
User since
2007-10-16
7 Artikel
BenutzerIn
[default_avatar]
Hallo Renee,

das hätte ich auch dazuschreiben müssen, dass das Skript unabhängig von den Zahlenwerten funktionieren muss. Diese Zahlen sind im Prinzip nur Koordinaten, die sich je nach Bauteil etc. ändern. Jedoch ist die Struktur immer gleich, die Werte ändern sich aber
renee
 2007-10-17 13:40
#100961 #100961
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ääähmmm, in meinem Regulären Ausdruck ist nichts von Zahlen zu sehen ;)
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/
Teesemmel
 2007-10-17 13:50
#100962 #100962
User since
2007-10-16
7 Artikel
BenutzerIn
[default_avatar]
Oh, da war ich etwas vorschnell (man muss dazu auch sagen dass ich bisher von der Perl Programmierung nicht wirklich viel Ahnung habe).

Eine Frage habe ich hier zu den Variablen.
Ich lese mein Input File folgendermaßen ein:

Code (perl): (dl )
sysopen(INPUT, $file, O_RDONLY) or die "unable to open the input file";    


Dann definiere ich folgenden Array:
Code (perl): (dl )
@array = <INPUT>;


Wie muss ich dein Skript umändern, damit das ganze auch mit Arrays funktioniert?

edit: Evtl. ist noch zu beachten dass die eingelesene Datei einen Umfang von knapp 10 MB hat, diese möchte ich in den Array einlesen

edit2: auch wenn es sicherlich einfachere lösungen gibt, wie müsste denn mein regulärer ausdruck aussehen, der sich über mehrere zeilen hinstreckt? wenn es nur eine zeile ist, funktioniert es. sobald allerdings ein zeilenumbruch drin steckt, tauchen probleme auf
renee
 2007-10-17 14:29
#100968 #100968
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Sind es mehrere Datensätze pro Datei? Wenn ja, sind die immer gleich aufgebaut? Am besten mal ein paar Dummy-Daten posten...
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/
Teesemmel
 2007-10-17 14:51
#100970 #100970
User since
2007-10-16
7 Artikel
BenutzerIn
[default_avatar]
Danke schon mal für eure Antworten. Ich habe mal mein Skript reduziert und hoffe dass ihr mir evtl helfen könnt dass es funktioniert.

Also ich habe folgendes Ausgangsfile (testinput.txt):

Code: (dl )
1
2
3
4
5
anderer text
123, 456, 789, 910
546, 879, 456, 123
testende
bla bla bla



und dazu folgendes Skript:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/local/bin/perl
############################
use strict;
use warnings;
use Fcntl qw/O_RDONLY O_WRONLY O_CREAT O_EXCL/;

my $file = 'testinput.txt';
my $tmp = 'output.txt';

sysopen(INPUT, $file, O_RDONLY) or die "unable to open the input file";    #Datei wird systemnah, nur zum Lesen, geöffnet
sysopen(OUTPUT, $tmp, O_WRONLY | O_CREAT) or die "unable to open job2.inp: $!";

while(my $test = <INPUT>)
  {
  print OUTPUT $test;
  if ($test =~/(anderer text)\n((\s*[0-9]*,)*(\s*[0-9]*)\n)*/)
  {
  print "okay, passt\n";

    while($test = <INPUT>)
    {
    if ($test =~/(testende)/)
      {
      print OUTPUT "das ist der text \n";
      print OUTPUT $test;
      print "jetzt steht was drin";
      }
    }
  }
  }
close (INPUT);
close (OUTPUT);


in dem Output File soll am Ende folgendes stehen:
Code: (dl )
1
2
3
4
5
6
anderer text
123, 456, 789, 910
546, 879, 456, 123
das ist der text
testende
bla bla bla


wenn ich die Zeile
Code (perl): (dl )
  if ($test =~/(anderer text)\n((\s*[0-9]*,)*(\s*[0-9]*)\n)*/)
folgendermaßen schreibe:

Code (perl): (dl )
if ($test =~/(456),\s*(123)/)

dann funktioniert es (aber so kann ich es nicht brauchen).
Lasse ich aber

Code (perl): (dl )
  if ($test =~/(anderer text)\n((\s*[0-9]*,)*(\s*[0-9]*)\n)*/)

dann sieht der Output folgendermaßen aus:
Code: (dl )
1
2
3
4
anderer text
das ist der text
testende
bla bla bla


Daher hege ich die starke Vermutung dass irgendwas an dem RA nicht passt?

Vielen Dank für eure Antworten!
Gruß Max
Taulmarill
 2007-10-17 15:23
#100972 #100972
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Sieht viel komplizierter aus, als es sein müsste. Wenn ich dein Problem richtig verstanden habe, müsste folgende while-Schleife anstatt der beiden von dir geschriebenen Schleifen funktionieren:

Code (perl): (dl )
1
2
3
4
while ( my $line = <INPUT> ) {
    print OUTPUT "das ist der text \n" if $line =~ /testende/;
    print OUTPUT $line;
}


Das Problem an dem von dir geschriebenen Regex ist übrigens, dass Elemente, die mit einem Stern gekennzeichnet sind, beliebig oft vorkommen dürfen. Beliebig bedeutet hier auch kein mal. Wenn ein Element mindestens ein mal vorkommen soll verwende anstatt des Sterns ein Pluszeichen.

Außerdem wird der Regex immer nur gegen eine einzelne Zeile und nicht gegen mehrere gematcht.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2007-10-17 13:11.