[Perl] Regulärer Ausruck mit Tabulator


chill0r55555

Mitglied
Hallo,

ich möchte gerne eine Datei durchsuchen, die folgendes Schema hat:

Code:
ABC 123<TAB>XXX<TAB>YYY<TAB>ZZZ<TAB>
ABC 456<TAB>XXX<TAB>YYY<TAB>ZZZ<TAB>
ABC 789<TAB><TAB>YYY<TAB>ZZZ<TAB>
Nun fehlt ja in der letzten Zeile das "XXX". Also habe ich mir einen Regulären Ausdruck gebastelt, der die Datei so durchsuchen soll, dass wenn zwischen dem ersten und zweiten Tabulator nichts steht die Zeile ausgegeben werden soll. Der Ausdruck funktioniert aber nur, wenn die letzte Zeile so aussieht:

Code:
ABC 789<TAB><TAB><TAB><TAB>
Sieht sie so aus geht es nicht:
Code:
ABC 789<TAB><TAB>YYY<TAB>ZZZ<TAB>
Hier ist mein Skript. Ich weiß leider nichtmehr weiter. Kenn mich auch nicht richtig gut aus mit regulären Ausdrücken. Befasse mich erst seit kurzem damit.

Code:
use strict;

my $kommentar = '--';
my $zeile=1;
my $error=0;

	open ($datei, '<', 'datei.txt') or die "datei.txt was not found!\n";
		while(<$datei>)
		{
			chomp;
				if($_ !~ /^.* .*\b\t.*\b\t.*/) {
					print "[$zeile] ".$_."\n";
					$error=1;
				}
			$zeile++;
		}
	close $datei;
	if ($error==0){
		print "no errors found.\n";
	}
MfG
 

Navy

Freiwillige Serverwehr
Code:
ABC\s[0-9]{3}\s+([^\s]+)\s*
dort kannst Du dann über den 1. Identifiert (\1) auf den Inhalt zurückgreifen.
 

renee

Erfahrenes Mitglied
@Navy: Da explizit "Tab" gefragt ist, sollte es an entsprechender Stelle \t statt \s heißen. Es könnte ja sein, dass in den Daten zwischen den Tabulatoren Leerzeichen sind.

Man kann es über split machen, wie deepthroat schon gesagt hat - und das finde ich die beste Lösung, oder mit RegEx:

Code:
if( $zeile =~ /^ABC\s\d{3}\t\t/ ) { ... }
 

chill0r55555

Mitglied
Ich danke euch für die Antworten. Da ich mit den RegExp nicht weiter gekommen bin, habe ich die Whileschleife folgendermaßen gemacht:

Code:
		while(<$datei>)
		{
			chomp;
				@zeilencontent = split(/\t/, $_);
				if ($zeilencontent[1] eq ""){
					print "[$zeile] ".$_."\n";
					$error=1;
				}
			$zeile++;
		}
Das ganze funktioniert bisher ohne Probleme. Danke nochmals für den Tipp mit Split.