Grep behält (gibt) die gesamte TXT-Datei aus, wenn eine Zeile eine Zeichenfolge enthält

Grep behält (gibt) die gesamte TXT-Datei aus, wenn eine Zeile eine Zeichenfolge enthält

ich weiß, dass

grep -rhI "# Active" > out.txt 

gibt jede Zeile aus, die # Activeim durchsuchten Verzeichnis enthalten ist, aber ich möchte den gesamten Inhalt der .txt-Datei, also Beispiel

beispiel.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

Wenn ich also nach „grep“ # Activesuche, soll es nicht nur die Zeile ausgeben, die # Activediese TXT-Datei enthält, sondern auch alle anderen Zeilen, Beispiel

Ausgabe.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

Antwort1

Für Nicht-GNU-Versionen von grep, bei denen es unwahrscheinlich ist, dass sie über verfügen -z, oder wenn Portabilität erforderlich ist …

grep -q pattern file && cat file

-qunterdrückt jegliche Ausgabe, aber wie üblich wird der Beendigungsstatus basierend darauf festgelegt, ob eine Musterübereinstimmung gefunden wurde oder nicht. Bei einer Musterübereinstimmung grepwird der Erfolgscode zurückgegeben 0, der äquivalent zuWAHRund das ermöglicht die catAusführung des Befehls.

Antwort2

Normalerweise zeigt grep einfach die passende Zeile an:

$ grep -rhI "# Active"
Line3 # Active

Um die gesamte Datei anzuzeigen, fügen Sie das -zFlag hinzu:

$ grep -rhIz "# Active"
Line1 
Line2
Line3 # Active
Line4
Line5
etc

-zist eine GNU-Erweiterung, die grep anweist, als Zeilentrennzeichen nicht Newline, sondern ein NUL-Zeichen zu verwenden. Da Textdateien im Allgemeinen keine NUL-Zeichen enthalten, bewirkt dies, dass grep die gesamte Datei liest, als wäre sie eine einzelne Zeile. Wenn eine Übereinstimmung vorliegt, wird folglich die gesamte Datei gedruckt.

Bei BSD/OSX-Versionen von grep ist die NUL-Eingabeoption nicht verfügbar und -zbedeutet etwas anderes.

Die anderen Grep-Optionen

-rweist grep an, Dateien und Verzeichnisse rekursiv zu durchsuchen.

-Iweist grep an, Binärdateien zu ignorieren

-hweist grep an, die Übereinstimmung ohne den angehängten Dateinamen auszudrucken.

Antwort3

sedAlternative:

sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile

Dieses Skript funktioniert, indem es Zeilen im halten Puffer sammelt (und löscht), bis eine passende Zeile gefunden wird. An diesem Punkt xändert es die Puffer und führt die Operation aus n(d. h. druckt und ruft die nächste Zeile ab), bis keine Eingabe mehr vorhanden ist.

Antwort4

Wenn Sie dies für mehrere Dateien tun möchten:

cat `grep -rIl "# Active" *`

Grep gibt die Liste der Dateinamen zurück und cat druckt sie aus.

verwandte Informationen