Waller: Regulärer Ausdruck - Treffer am Dateianfang

Hallo,
ich möchte nur den Treffer am Anfang der Datei erhalten.
Wenn ich z.B in InfoRapid angebe

^a.*\r\n

erhalte ich jede Zeile, die mit a anfängt.
Wie erreiche ich, dass ich nur solche erhalte, die am Dateianfang, d.h. in der ersten Zeile der Datei stehen?

  1. Lieber Waller,

    ^a.*\r\n

    das will man sich etwas übersetzen, damit man weiß, was man tut.

    ^ bedeutet "Anfang", je nach Einstellung auch "Zeilenanfang".
      Da solltest Du sicherstellen, dass ersteres gilt.

    a bedeutet, dass ein Kleinbuchstabe "a" folgen muss.
      Vielleicht ist Dir die Groß-/Kleinschreibung ja egal?

    . bedeuet "ein beliebiges Zeichen".

    * bedeutet "0 oder mehr davon".
      Mit dem vorherigen Zeichen zusammen bedeutet das "eine beliebige Folge
      von Zeichen, die auch leer sein kann".

    \r\n bedeutet ein Zeilenende nach Windows-Art, nämlich
      \r für Zeilenvorschub (line feed oder kurz LF, ASCII-Wert #10) und
      \n für Wagenrücklauf (carriage return oder kurz CR, ASCII-Wert #13)
      Beides sind Steuerzeichen aus der Zeit des Typenraddruckers.

    Wie erreiche ich, dass ich nur solche erhalte, die am Dateianfang, d.h. in der ersten Zeile der Datei stehen?

    Du wirst wohl vermeiden müssen, dass das Suchmuster irgendetwas zusätzliches prüft, das nach den ersten wesentlichen Zeichen stehen könnte, da sonst vielleicht eine ungewollte Übereinstimmung entsteht.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo Felix,

      ^ bedeutet "Anfang", je nach Einstellung auch "Zeilenanfang".
        Da solltest Du sicherstellen, dass ersteres gilt.

      wenn das ein echter RegEx sein soll, ja. Es gibt aber viele Programme, die etwas RegEx-ähnliches verwenden. So ist ^a in Word beispielsweise ein Platzhalter für irgendein Steuerzeichen, ich weiß gerade nicht mehr welches. Ich meine, es wäre ein Absatzende. Die vom OP verwendete Software benutzt aber tatsächlich RegEx (mit kleinen Erweiterungen).

      \r für Zeilenvorschub (line feed oder kurz LF, ASCII-Wert #10) und
        \n für Wagenrücklauf (carriage return oder kurz CR, ASCII-Wert #13)

      Genau umgekehrt: \r ist CR (13), \n ist LF (10). Spielt aber hier keine Rolle.
      Wichtig ist nur: Wenn man nach der Kombination sucht, muss man \r und \n natürlich in der richtigen Reihenfolge angeben. Sucht man nach \r\n, dann findet man die sehr selten vorkommende Abart \n\r natürlich nicht.

      Abgesehen davon würde ich in einem regulären Ausdruck eher das Zeichen $ für "Ende der Zeile/des Strings" nehmen.

      Wie erreiche ich, dass ich nur solche erhalte, die am Dateianfang, d.h. in der ersten Zeile der Datei stehen?

      In der Hilfedatei heißt es im Abschnitt "Search Expressions", dass das Zeichen ^ nur für den Zeilenanfang steht. Ich konnte keinen Hinweis auf eine Suche nur am Dateianfang finden. Vielleicht mal mit ".{0}" oder "(.){0}" als Beginn des Suchmusters probieren?

      So long,
       Martin

      --
      Das Leben ist lebensgefährlich und endet meistens tödlich.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Hallo Martin,

        Wie erreiche ich, dass ich nur solche erhalte, die am Dateianfang, d.h. in der ersten Zeile der Datei stehen?

        In der Hilfedatei heißt es im Abschnitt "Search Expressions", dass das Zeichen ^ nur für den Zeilenanfang steht. Ich konnte keinen Hinweis auf eine Suche nur am Dateianfang finden. Vielleicht mal mit ".{0}" oder "(.){0}" als Beginn des Suchmusters probieren?

        Das klappt leider nicht.
        Ist aber diese Fragestellung so exotisch?
        Zugrunde liegt das Problem, vor die erste Zeile mehrerer Dateien jeweils eine bestimmte Zeile einzufügen. Wenn der Anfang der Ursprungsdatei bekannt ist, ist es trivial, über das Replace eine Zeile davor zu setzen.

      2. Moin,

        Abgesehen davon würde ich in einem regulären Ausdruck eher das Zeichen $ für "Ende der Zeile/des Strings" nehmen.

        Es kommt drauf an, was man machen will. Will man ganze Zeilen löschen, eignet sich in einigen RegEx-Implementierungen $ nicht, da \r\n in den Zeilen stehen bleiben und man somit Leerzeilen schafft, quasi nur den Inhalt der Zeile löscht.

        Grüße Marco

  2. Wie erreiche ich, dass ich nur solche erhalte, die am Dateianfang, d.h. in der ersten Zeile der Datei stehen?

    Unter Linux gäbe es "head". Damit kannst du dir einen beliebig langen Begin einer Datei ausgeben lassen. "head -n 1 <dateien>" würde nur die jeweils erste Zeile ausgeben, "head -c K <dateien> gibt die ersten K byte aus. Wenn du K auf die Länge des gesuchten Musters beschränkst und dies dann mit einer pipe "|" an "sed" mit deinem regulären Ausdruck übergibst, dann sollte übrig bleiben was du suchst.

    Ob dafür unter Win ein Äquivalent vorhanden ist weiß ich natürlich nicht.

  3. $fh = fopen($file,"r");  
    if($fh){  
         $line = fgets($fh);  
         fclose($fh);  
         if(strpos($line,"a")==0){  
              // mach was  
         }  
    }  
    
    

    Liest die erste Zeile einer Datei aus, prüft ob "a" das erste Zeichen ist (für case-insensitive stripos verwenden), und macht dann irgendwas.

    MfG
    bubble

    --
    If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
  4. Hi,

    ich möchte nur den Treffer am Anfang der Datei erhalten.

    \A ist bei Perl-Regexes der String-Anfang, \Z wäre das Ende.

    Wenn ich z.B in InfoRapid angebe

    Ob InfoRapid das unterstützt, darfst Du selbst ermitteln.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.