Thread regexp spaltenbasiert
(14 answers)
Opened by parafux at 2018-04-10 11:15
Bin mir nicht sicher, ob ich Dich richtig verstehe.
Vielleicht so: Du könntest mit Wildcards, Quantifiern und einfangenden Klammern (in Perl) arbeiten. Code: (dl
)
s/^(.{10})\s\s\s/$1\t\t/ Vielleicht helfen auch Perls "Lookaround-Assertions": perlre Lookaround-Assertions Alternativ könnte man sowas auch in Perl mit perlfunc substr machen. Grundlegend nur string-basiert, wenn es variabel (z.B. mit Regex) werden soll, muss man da drum herum arbeiten. Was heißt "bestimmte Spalte"; woran wird das fest gemacht? Vielleicht sind Regex auch das falsche Werkzeug für Dein Problem. Aber das habe ich auch wahrscheinlich noch nicht richtig erkannt. Innerhalb von Perl kannst Du im Ersetzungsteil auch Funktionen aufrufen. So könnte man auch die zu ersetzenden Zeichen zählen und dann entsprechend eine dynamische Anzahl Ersetzungszeichen einfügen. Beispiel, ungetestet: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sub replace_with { my ( $old, $new ) = @_; # ermittle, wie viele Leerzeichen ersetzt werden sollen my $length = length($old); # ein $new soll 8 Zeichen ersetzen $replacement = "$new" x int( $len/8 ); # wenn ein Rest bleibt, muss ein weiteres $new dazu $replacement .= "$new" if $length % 8; return $replacement; } # Ersetze "echte" Leerzeichen durch Tabs $line =~ s/( +)/replace_with($1,"\t")/eg; Ein anderer Ansatz wäre, die Zeile aufzusplitten und beispielsweise mit printf neu zu formatieren und auszugeben. Code (perl): (dl
)
1 2 3 4 5 6 7 # ist eher ein Kandidat für einen einzeiler oder skript; weniger direkt als spontane Eingabe im Editor # vielleicht als Funktion vorbereitbar und dann verwendbar my @fields = split /\s+/, $line; my $format = ( "%25s" x @fields ) . "\n"; printf $format, @fields; Vielleicht liege ich auch komplett falsch. Aber mehr als raten bleibt nicht, da die Beschreibung bisher recht vage ist. meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |