Ich habe ein Skript mycommand.sh
, das ich nicht zweimal ausführen kann. Ich möchte die Ausgabe in zwei verschiedene Dateien aufteilen, wobei eine Datei die Zeilen enthält, die einem regulären Ausdruck entsprechen, und eine Datei die Zeilen enthält, die keinem regulären Ausdruck entsprechen. Was ich haben möchte, ist im Grunde so etwas:
./mycommand.sh | grep -E 'some|very*|cool[regex].here;)' --match file1.txt --not-match file2.txt
Ich weiß, dass ich die Ausgabe einfach in eine Datei und dann in zwei verschiedene Greps mit und ohne Option -v umleiten und ihre Ausgabe in zwei verschiedene Dateien umleiten kann. Aber ich habe mich nur gefragt, ob es möglich ist, es mit einem Grep zu tun.
Ist es also möglich, in einer einzigen Zeile das zu erreichen, was ich will?
quelle
w filename
- Schreibe den aktuellen Musterraum in den Dateinamen.Wenn Sie möchten, dass alle übereinstimmenden Zeilen zu
file_1
und alle nicht übereinstimmenden Zeilen zufile_2
wechseln, können Sie Folgendes tun:oder
Erläuterung
/pattern/!{p;d};
/pattern/!
- negation - wenn eine Zeile nicht enthältpattern
.p
- Den aktuellen Musterbereich drucken.d
- Musterraum löschen. Beginnen Sie den nächsten Zyklus.file_2
in unserem Fall an umgeleitet . Der nächste Teil dessed
Skripts (w file_1
) wird nicht erreicht, solange die Linie nicht mit dem Muster übereinstimmt.w file_1
- Wenn eine Zeile ein Muster enthält, wird der/pattern/!{p;d};
Teil übersprungen (da er nur ausgeführt wird, wenn das Muster nicht übereinstimmt), und diese Zeile geht daher zumfile_1
.quelle
file_1
undfile_2
in die richtige Reihenfolge getauscht.Ich mochte die
sed
Lösung, da sie nicht auf Bashismen beruht und die Ausgabedateien auf derselben Grundlage behandelt. AFAIK, es gibt kein eigenständiges Unix-Tool, das genau das tut, was Sie wollen. Sie müssen es also selbst programmieren. Wenn wir den Schweizer Taschenmesser-Ansatz aufgeben würden, könnten wir eine der Skriptsprachen (Perl, Python, NodeJS) verwenden.So würde es in NodeJS gemacht
Anwendungsbeispiel
quelle
Wenn Ihnen die Verwendung von Python und eine andere Syntax für reguläre Ausdrücke nichts ausmacht:
Verwendung
Beispiel
quelle