Thread regexp spaltenbasiert (14 answers)
Opened by parafux at 2018-04-10 11:15

Linuxer
 2018-04-10 15:46
#188252 #188252
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
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/
sollte die drei Whitespaces an Position 11 bis 13 durch zwei Tabs ersetzen...

Vielleicht helfen auch Perls "Lookaround-Assertions": Perldoc:perlre Lookaround-Assertions

Alternativ könnte man sowas auch in Perl mit Perldoc: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:
more (3.5kb):

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!

View full thread regexp spaltenbasiert