Projekt dgrep: Unterschied zwischen den Versionen

Aus Info-Theke
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „= Zielsetzung = Es wir ein Kommandozeilenprogramm erstellt, das einen String, definiert mit einem regulären Ausdruck, in Dateien, evt. in mehreren Dateibäume…“)
 
 
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 7: Zeile 7:


== Beschreibung ==
== Beschreibung ==
<pre>Usage: dgrep [<options>] <pattern> <file1> [<file2>] ..
<pre>Usage: dgrep [<options>] <pattern> [<file1> [<file2> ...]]
   Searches <pattern> in <file1> <file2>...
   Searches <pattern> in <file1> <file2>...
   <fileN>: a filename pattern or a directory, e.g. "/opt" "opt/*.txt" "*.doc"
   <fileN>: a directory or a shell file pattern like '*.txt'
Examples:
    or both like /home/*.txt
dgrep -r "version.*2"
dgrep -V2 -i -r "happy|lucky" "*.txt" "--excluded=test.*" "--excluded-dirs=.git|.config"
<option>:
<option>:
-c, --count              Show only the count of lines with hits (per file)
-c, --count              Show only the count of lines with hits (per file)
Zeile 19: Zeile 17:
     --process-binaries    Normally binary files will not be processed
     --process-binaries    Normally binary files will not be processed
-h, --help                Show the command description
-h, --help                Show the command description
-H, --hits                Show only the number of hits (per file): a line can contain many hits
-l, --list                Show the filename only, not the matching lines
-l, --list                Show the filename only, not the matching lines
-r, --recursive          Searches in all sub directories too
-r, --recursive          Searches in all sub directories too
-w, --word                The patter describes a word: a hit will be delimited by word boundaries
-w, --word                The pattern describes a word: a hit will be delimited by word boundaries
-x, --excluded            A regular expression for files to skip, e.g. ".*.(bak|sic)"
-x, --excluded            A regular expression for files to skip, e.g. ".*.(bak|sic)"
-X, --excluded-dirs      A regular expression for directory to skip, e.g. "test|.git|.config
-X, --excluded-dirs      A regular expression for directory to skip, e.g. "test|.git|.config
Zeile 57: Zeile 54:
                           (defaults to "0")
                           (defaults to "0")
</pre>
</pre>
= Kenntnisse =
= Kenntnisse =
* Umgang mit Verzeichnissen
* Umgang mit Verzeichnissen und Dateien
* Rekursiver Methodenaufruf
* Unittests
* Unittests
* Generator


= Projekt erstellen =
= Projekt erstellen =
Zeile 83: Zeile 81:
* auf das Symbol ">" klicken, dann klappt das Verzeichnis aus
* auf das Symbol ">" klicken, dann klappt das Verzeichnis aus
* Im Unterverzeichnis <code>bin</code> liegt die Datei mit dem Hauptprogramm, <code>dgrep.dart</code>.
* Im Unterverzeichnis <code>bin</code> liegt die Datei mit dem Hauptprogramm, <code>dgrep.dart</code>.
* Herunterladen der Datei [https://github.com/flutter-tutorial-de/dart-programming Zip-Datei] und diese im Projektverzeichnis (<code>c:\dev\dgrep</code> oder <code>~/dev/dgrep</code>) entpacken.
* Herunterladen der Datei [https://github.com/flutter-tutorial-de/dart-programming/raw/main/resources/dgrep.v1.zip dgrep.v1.zip] und diese im Projektverzeichnis (<code>c:\dev\dgrep</code> oder <code>~/dev/dgrep</code>) entpacken.


== dgrep.dart ==
== dgrep.dart ==
Zeile 96: Zeile 94:
* <code>SearchEngine.execute(arguments);</code> Die Klasse <code>SearchEngine</code> besitzt eine statische Methode <code>execute()</code>, die als Parameter die Liste der Programmargument erhält und die Suche erledigt.
* <code>SearchEngine.execute(arguments);</code> Die Klasse <code>SearchEngine</code> besitzt eine statische Methode <code>execute()</code>, die als Parameter die Liste der Programmargument erhält und die Suche erledigt.


== helper.dart ==
== pubspec.yaml ==
Durch das obige Entpacken der Zip-Datei gibt es die Datei lib/helper.dart.
Wir verwenden zwei externe Pakete, <code>path</code> für Behandlung von Dateinamen und <code>args</code> für die Auswertung von Programmargumenten.


Die <code>helper.dart</code> enthält nur einzelne Funktionen, die in [[dgrep-helper.dart ]] beschrieben werden.
Dazu kommt das externe Paket für Unittests <code>test</code> und die Unterstützung für die Quellcodeanalyse <code>pedantic</code>


== search_engine.dart ==
Die Datei <code>pubspec.yaml</code> muss deshalb so aussehen:
Durch das obige Entpacken der Zip-Datei gibt es die Datei lib/search_engine.dart.
<pre>name: dgrep
Es folgt eine Besprechung von Ausschnitten der Datei.
description: A program for searching regular expressions in files.
version: 0.1.0


*
environment:
<code>
  sdk: '>=2.10.0 <3.0.0'
* Im Unterverzeichnis <code>lib</code> liegt eine zweite Datei <code>dsuche.dart</code>, die ergänzenden Code enthält. In diesem Projekt brauchen wir diese Datei nicht. also löschen: <code>Rechte Maustaste - Delete</code>
* ziemlich unten gibt es die Datei <code>pubspec.yaml</code> Dort werden Pakete eingetragen.  


= Programmcode in dsuche.dart =
#dependencies:
Kopiere folgenden Code in die Datei <code>bin\dsuche.dart</code>
  args: ^1.6.0
<pre>import 'dart:io';
  path: ^1.7.0
/// Durchsuchen einer Datei nach einem regulären Ausdruck.
 
/// [args]: Programm-Argumente, z.B. [r'https?://', 'rechnung.txt']
dev_dependencies:
void main(List<String> args) {
   pedantic: ^1.9.0
   if (args.length < 2){
   test: ^1.15.7
    print('Gebrauch: dsuche <suchmuster> <date>\nBeispiel: dsuche "https?://" rechnung.txt');
   } else {
    final lines = File(args[1]).readAsLinesSync();
    RegExp regExp = RegExp(args[0], caseSensitive: false);
    for (var line in lines){
      if (regExp.firstMatch(line) != null){
        print(line);
      }
    }
  }
}
</pre>
</pre>
= Programm in der Entwicklungsumgebung starten =
 
* In der Toolbar den grünen Hammer <code>Add configuration</code> klicken
== Die Quellcodedateien ==
* Es geht eine Dialogbox auf: Oben links auf das <code>+</code> klicken
Durch das obige Entpacken der Zip-Datei gibt es folgende Dateien im Verzeichnis <code>lib</code>:
* In der Liste <code>Dart Command Line App</code>
 
* Name: <code>dsuche</code>
* Die [[Datei helper.dart]]: kleine Hilfsfunktionen, die sonst nirgens hinpassen.
* Dart file: Hier auf das Ordnersymbol in dem Textfeld klicken, dort Ordner <code>dsuche</code> aufklappen, im Unterordner <code>bin</code> die Datei <code>dsuche.dart</code> anklicken.
* Die [[Datei search_engine.dart]]: die Klasse <code>SearchEngine</code>, die die Suche organisiert.
* Program arguments:
 
** Windows: <code>https?:// c:\dev\links.txt</code>
Zu jeder obigen Datei gehört eine Datei, die die Unittests enthält. Per Konvention wird einfach ein <code>_test</code> an den Namen angehängt.
** Linux: <code>https?:// ~/dev/links.txt</code>
* Die [[Datei search_engine_test.dart]]: testet die Klasse <code>SearchEngine</code>
* Button <code>Ok</code>
* Die [[Datei helper_test.dart]]: testet die Funktionen.
* Im Entwicklungsordner (Windows: c:\dev, Linux: ~/dev/) eine Datei links.html anlegen:
 
<pre>Dies ist eine Testdatei
= Programm compilieren =
Suchen geht mit https://google.com
== Linux ==
Spezialwissen findet sich auf http://wikipedia.de
* Terminal öffnen
Hab Spaß mit Programmieren.
<pre>gdev dsuche
dcompile dsuche
</code>
Danach gibt es die Datei <code>/usr/local/bin/dsuche</code>.
Dieses Programm kann in der Eingabeaufforderung gestartet werden.
<pre>dgrep -r main "~/dev/*.dart" -V2
</pre>
</pre>


= Programm compilieren =
== Windows ==
== Windows ==
* Eingabeaufforderung starten
* Eingabeaufforderung starten
* <code>gdev dsuche</code>
* <code>gdev dgrep</code>
* <code>dcompile dsuche</code>
* <code>dcompile dgrep</code>
Danach gibt es die Datei <code>c:\dev\bin\dsuche.exe</code>
Danach gibt es die Datei <code>c:\dev\bin\dgrep.exe</code>
Dieses Programm kann in der Eingabeaufforderung gestartet werden.
Dieses Programm kann in der Eingabeaufforderung gestartet werden.
<pre>gdev
<pre>dgrep -r "main" "c:\dev\*.dart" -V2
dsuche https?:// links.txt
</pre>
</pre>

Aktuelle Version vom 5. Januar 2021, 20:51 Uhr

Zielsetzung[Bearbeiten]

Es wir ein Kommandozeilenprogramm erstellt, das einen String, definiert mit einem regulären Ausdruck, in Dateien, evt. in mehreren Dateibäumen, sucht.

Mit zahlreichen Optionen kann die Suche eingegrenzt und die Ausgabe spezifiziert werden.

Das Programm hat eine Erklärfunktion (Aufruf mit Option "--help" oder "-h").

Beschreibung[Bearbeiten]

Usage: dgrep [<options>] <pattern> [<file1> [<file2> ...]]
  Searches <pattern> in <file1> <file2>...
  <fileN>: a directory or a shell file pattern like '*.txt'
    or both like /home/*.txt
<option>:
-c, --count               Show only the count of lines with hits (per file)
-i, --ignore-case         The search is case insensitive
-v, --invert-match        Show lines that do not contain the pattern
    --process-binaries    Normally binary files will not be processed
-h, --help                Show the command description
-l, --list                Show the filename only, not the matching lines
-r, --recursive           Searches in all sub directories too
-w, --word                The pattern describes a word: a hit will be delimited by word boundaries
-x, --excluded            A regular expression for files to skip, e.g. ".*.(bak|sic)"
-X, --excluded-dirs       A regular expression for directory to skip, e.g. "test|.git|.config
-f, --format              Describes the format of a found line
                          The format is a string with placeholders. 
                          Example: The name of the file is "/doc/data.txt", the search pattern is "(\w+).* (\d+\.\d\d) "
                            the found line is "apples: 20 kg 20.00 EUR"
                          %f% full name of the file, e.g. "/doc/data.txt"
                          %p% the path of the file, e.g. "/doc"
                          %n% the node, e.g. "data.txt"
                          %F% the filename, e.g. "data"
                          %e% the extension, e.g. ".txt"
                          %#% the line number
                          %h% the hit, e.g. ": 20 "
                          %c% the count of hit lines. Only meaningful together with option "--count"
                          %l% the line with the hit, e.g. "apples: 20 kg 20.00 EUR"
                          %1% the first group, e.g. "apple"
                          %2% the 2.nd group, e.g. "20.00"
                          ...
                          %9% the 9.th group, e.g. "" (not found)
                          A meaningful format of the above example: "%f%: product: %1% price: %2%"
-F, --format-context      Describes the format of a context line (see above-context...)
                          The format is a string with placeholders like the option --format.
-a, --above-context       That number of lines above the hit line will be showed
                          (defaults to "0")
-C, --context             That number of lines above and below the hit line will be showed
                          (defaults to "0")
-b, --below-context       That number of lines below the hit line will be showed
                          (defaults to "0")
    --break-lines         Stops the search in a file if that number of matching lines is reached
    --exit-lines          Stops the search if that number of matching lines is reached (over all files)
    --exit-files          Stops the search if that number of files with matching lines is reached
-V, --verbose-level       0: no additional info 1: summary 2: detail 3: loop 4: fine
                          (defaults to "0")

Kenntnisse[Bearbeiten]

  • Umgang mit Verzeichnissen und Dateien
  • Rekursiver Methodenaufruf
  • Unittests

Projekt erstellen[Bearbeiten]

  • IdeaIC starten
  • Menü: File - New - <Project>
  • Linke Spalte: Dart
  • Dart-SDK:
    • Windows: c:\dart-sdk
    • Linux: ~/dart-sdk
  • Es erscheint eine Listbox, dort Console-Application a command-line application sample anklicken
  • Next-Button
  • Project name: dgrep
  • Project loction:
    • Linux: ~/dev/dgrep
    • Windows: c:\dev\dgrep
  • Finish-Button

Damit ist das Projekt names dgrep erstellt.

Projekt erkunden[Bearbeiten]

  • Linke Spalte: Projects anklicken
  • Es wird ein Ordner namens dgrep sichtbar
  • auf das Symbol ">" klicken, dann klappt das Verzeichnis aus
  • Im Unterverzeichnis bin liegt die Datei mit dem Hauptprogramm, dgrep.dart.
  • Herunterladen der Datei dgrep.v1.zip und diese im Projektverzeichnis (c:\dev\dgrep oder ~/dev/dgrep) entpacken.

dgrep.dart[Bearbeiten]

Wir tragen ein:

import 'package:dgrep/search_engine.dart';

void main(List<String> arguments) {
  SearchEngine.execute(arguments);
}
  • package:dgrep/search_engine.dart Wir importieren die Klasse SearchEngine.
  • SearchEngine.execute(arguments); Die Klasse SearchEngine besitzt eine statische Methode execute(), die als Parameter die Liste der Programmargument erhält und die Suche erledigt.

pubspec.yaml[Bearbeiten]

Wir verwenden zwei externe Pakete, path für Behandlung von Dateinamen und args für die Auswertung von Programmargumenten.

Dazu kommt das externe Paket für Unittests test und die Unterstützung für die Quellcodeanalyse pedantic

Die Datei pubspec.yaml muss deshalb so aussehen:

name: dgrep
description: A program for searching regular expressions in files.
version: 0.1.0

environment:
  sdk: '>=2.10.0 <3.0.0'

#dependencies:
  args: ^1.6.0
  path: ^1.7.0

dev_dependencies:
  pedantic: ^1.9.0
  test: ^1.15.7

Die Quellcodedateien[Bearbeiten]

Durch das obige Entpacken der Zip-Datei gibt es folgende Dateien im Verzeichnis lib:

Zu jeder obigen Datei gehört eine Datei, die die Unittests enthält. Per Konvention wird einfach ein _test an den Namen angehängt.

Programm compilieren[Bearbeiten]

Linux[Bearbeiten]

  • Terminal öffnen
gdev dsuche
dcompile dsuche
</code>
Danach gibt es die Datei <code>/usr/local/bin/dsuche</code>.
Dieses Programm kann in der Eingabeaufforderung gestartet werden.
<pre>dgrep -r main "~/dev/*.dart" -V2

Windows[Bearbeiten]

  • Eingabeaufforderung starten
  • gdev dgrep
  • dcompile dgrep

Danach gibt es die Datei c:\dev\bin\dgrep.exe Dieses Programm kann in der Eingabeaufforderung gestartet werden.

dgrep -r "main" "c:\dev\*.dart" -V2