
# Αναζήτηση κειμένου

Η λειτουργία κειμένου του Greph είναι αναζήτηση byte ανά γραμμή σε ένα δέντρο αρχείων που διασχίζεται. Είναι η προεπιλεγμένη λειτουργία του `greph` CLI και της πρόσοψης `Greph::searchText()`. Η έξοδος χρησιμοποιεί την κανονική μορφή `file:line:content`, την οποία αναλύουν το grep, το ripgrep και οι περισσότερες ενσωματώσεις επεξεργαστών.

## Γρήγορα παραδείγματα

```bash
# Regex search across the current directory
./vendor/bin/greph "function\s+\w+"

# Fixed-string search across src/
./vendor/bin/greph -F "function" src

# Case-insensitive whole-word search
./vendor/bin/greph -F -i -w "function" src

# Two lines of context around each match
./vendor/bin/greph -F -C 2 "TODO" src

# Stop after the first three matches per file
./vendor/bin/greph -F -m 3 "TODO" src

# Files that contain the pattern
./vendor/bin/greph -F -l "TODO" src

# Files that do not contain the pattern
./vendor/bin/greph -F -L "TODO" src

# Count matches per file
./vendor/bin/greph -F -c "TODO" src

# Inverted match
./vendor/bin/greph -F -v "TODO" src/notes.txt
```

## Μοτίβα

Από προεπιλογή, το μοτίβο αντιμετωπίζεται ως κανονική έκφραση PCRE2. Οι συναρτήσεις `preg_*` του PHP υλοποιούν τη μηχανή, επομένως η σύνταξη αντιστοιχεί στην αναφορά PCRE του [PHP](https://www.php.net/manual/en/pcre.pattern.php).

Απενεργοποιήστε τη μηχανή regex με το `-F` για να αντιμετωπιστεί το μοτίβο ως κυριολεκτική ακολουθία byte. Η λειτουργία σταθερής συμβολοσειράς είναι η γρήγορη διαδρομή: χρησιμοποιεί το `strpos()` για την αντιστοίχιση και παραλείπει εντελώς το βήμα μεταγλώττισης PCRE2.

Το `-i` κάνει και τις δύο λειτουργίες να μην κάνουν διάκριση πεζών-κεφαλαίων. Το `-w` προσθέτει όρια ολόκληρης λέξης και στις δύο πλευρές της αντιστοίχισης.

## Φιλτράρισμα αρχείων

Το Greph διασχίζει το δέντρο αρχείων πριν από την αναζήτηση. Το εργαλείο διάσχισης είναι κοινό με τη λειτουργία AST και τη λειτουργία ευρετηρίου, επομένως οι ίδιες σημαίες φιλτραρίσματος ισχύουν παντού.

| Σημαία | Επίδραση |
|---|---|
| `--type NAME` | Συμπεριλαμβάνει μόνο αρχεία που αντιστοιχούν στο καθορισμένο ψευδώνυμο τύπου (`php`, `js`, `md`, ...) |
| `--type-not NAME` | Εξαιρεί αρχεία που αντιστοιχούν στο καθορισμένο ψευδώνυμο τύπου |
| `--glob GLOB` | Συμπεριλαμβάνει μόνο αρχεία των οποίων οι διαδρομές αντιστοιχούν στο GLOB. Μπορεί να επαναληφθεί. |
| `--no-ignore` | Δεν λαμβάνει υπόψη τα `.gitignore` ή `.grephignore` |
| `--hidden` | Συμπεριλαμβάνει κρυφά αρχεία |

Από προεπιλογή, το εργαλείο διάσχισης τηρεί τα `.gitignore` και `.grephignore`, παραλείπει δυαδικά αρχεία (εντοπίζονται από μηδενικά byte στα πρώτα 512 byte) και περιορίζει το μέγεθος αρχείου στα 10 MiB. Και τα δύο όρια ρυθμίζονται μέσω του `WalkOptions`.

Δείτε το [API / FileTypeFilter](https://greph.inline0.dev/el/docs/api#grephwalkerfiletypefilter) για την πλήρη λίστα των ενσωματωμένων ψευδωνύμων τύπων.

## Πλαίσιο, μετρήσεις και λειτουργίες μόνο για αρχεία

```bash
# Two lines before and after each match
./vendor/bin/greph -F -C 2 "needle" src

# Two lines after, no lines before
./vendor/bin/greph -F -A 2 "needle" src

# Two lines before, no lines after
./vendor/bin/greph -F -B 2 "needle" src

# Count matches per file
./vendor/bin/greph -F -c "needle" src

# List matching files only
./vendor/bin/greph -F -l "needle" src

# List non-matching files only
./vendor/bin/greph -F -L "needle" src
```

Τα `-c`, `-l` και `-L` παρακάμπτουν πρόωρα τη μορφοποίηση, ώστε να αποφεύγουν τη δημιουργία κάθε γραμμής στη μνήμη. Είναι οι κατάλληλες λειτουργίες για ερωτήματα τύπου «πόσα» και «πού».

## Παράλληλες σαρώσεις

Περάστε το `-j N` για να κατανείμετε τη σάρωση σε N εργάτες. Το Greph χρησιμοποιεί το `pcntl_fork()` για τη δεξαμενή εργατών και επιστρέφει σε εκτέλεση μίας διεργασίας όταν το `ext-pcntl` δεν είναι διαθέσιμο.

```bash
./vendor/bin/greph -F -j 8 "function" src
```

Η πρόσοψη υπολογίζει αν αξίζει το κόστος της παράλληλης εκτέλεσης με βάση τον αριθμό αρχείων, τη λειτουργία και τη μορφή του μοτίβου. Κάτω από το όριο, παραμένει σε μία διεργασία. Δείτε το [Για προχωρημένους / Παράλληλοι εργάτες](https://greph.inline0.dev/el/docs/advanced/parallel) για τους ευρετικούς κανόνες.

## Έξοδος JSON

Το `--json` εκπέμπει ένα δομημένο φορτίο δεδομένων που μπορούν να αναλύσουν τα επόμενα εργαλεία χωρίς να διαβάζουν την οθόνη για να εξαγάγουν τη μορφή grep:

```bash
./vendor/bin/greph --json -F "function" src
```

```json
[
  {
    "file": "src/Greph.php",
    "matches": [
      {
        "line": 31,
        "column": 1,
        "content": "final class Greph",
        "matched_text": "function",
        "captures": []
      }
    ]
  }
]
```

Το περιτύλιγμα `rg` εκπέμπει αντί αυτού JSON σε μορφή συμβάντων ripgrep. Χρησιμοποιήστε το όταν ένας υπάρχων καταναλωτής αναμένει το σχήμα ripgrep.

## Προγραμματιστική χρήση

```php
use Greph\Greph;
use Greph\Text\TextSearchOptions;

$results = Greph::searchText(
    'function',
    'src',
    new TextSearchOptions(
        fixedString: true,
        caseInsensitive: true,
        beforeContext: 1,
        afterContext: 1,
        jobs: 4,
    ),
);

foreach ($results as $file) {
    foreach ($file->matches as $match) {
        echo "{$file->file}:{$match->line}:{$match->content}\n";
    }
}
```

Τα αντικείμενα αποτελεσμάτων τεκμηριώνονται στο [API / Αντικείμενα αποτελεσμάτων](https://greph.inline0.dev/el/docs/api#result-objects).

## Πώς λειτουργεί

Η μηχανή κειμένου έχει δύο διαδρομές:

- **Κυριολεκτική διαδρομή**: όταν έχει οριστεί το `-F`, η αναζήτηση εκτελείται `strpos()` μέσω ενός buffer αναγνώστη 64 KiB και παρακολουθεί τις αλλαγές γραμμής για την αρίθμηση γραμμών. Δεν γίνεται μεταγλώττιση regex.
- **Διαδρομή regex**: όταν δεν έχει οριστεί το `-F`, το Greph εξάγει κυριολεκτικά υποσυμβολοσειρές από το μοτίβο χρησιμοποιώντας έναν μικρό αναλυτή τύπου PCRE (`Greph\Text\LiteralExtractor`) και τις χρησιμοποιεί ως προφίλτρο `strpos()`. Οι γραμμές που περνούν το προφίλτρο αντιστοιχίζονται στη συνέχεια με το μεταγλωττισμένο μοτίβο PCRE2 με ενεργοποιημένο το JIT.

Και οι δύο διαδρομές χρησιμοποιούν το ίδιο `BufferedReader` για I/O. Ο αναγνώστης διαβάζει σε τμήματα των 64 KiB αντί για `fgets()` ανά γραμμή, μειώνοντας δραστικά τον αριθμό κλήσεων συστήματος σε μεγάλα αρχεία.

Για επαναλαμβανόμενους φόρτους εργασίας, η [λειτουργία κειμένου με ευρετήριο](https://greph.inline0.dev/el/docs/indexed/text) αντικαθιστά τον αναγνώστη buffer με μια θερμή αποθήκη τριγράμματων και καταχωρίσεων αναγνωριστικών και παραλείπει τα περισσότερα αρχεία εντελώς.
