Eingabedatei1 ist:
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
Ich gebe dem Match das Muster aus in other file
(wie dog 123 4335
aus file2).
Ich stimme mit dem Muster der Linie überein dog 123 4335
und nachdem ich alle Linien ohne Übereinstimmungslinie gedruckt habe, ist meine Ausgabe:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Wenn Sie nur ohne Adresse der Zeile verwenden, verwenden Sie nur das Muster, z. B. 1s
wie Sie die Zeilen abgleichen und drucken?
text-processing
sed
grep
loganaayahee
quelle
quelle
Antworten:
Angenommen, Sie möchten mit GNU die gesamte Zeile mit Ihrem Muster abgleichen
sed
:Standardäquivalent:
Mit folgender Eingabe (
infile
):Die Ausgabe ist:
Erläuterung:
/^dog 123 4335$/
Sucht nach dem gewünschten Muster.:a; n; p; ba;
ist eine Schleife, die eine neue Zeile von input (n
) abruft, sie druckt (p
) und zu label a zurückverzweigt:a; ...; ba;
.Aktualisieren
Hier ist eine Antwort, die Ihren Anforderungen näher kommt, dh Muster in Datei2, das von Datei1 abweicht:
Das eingebettete grep und cut findet die erste Zeile, die ein Muster aus file2 enthält, diese Zeilennummer plus eins wird an tail weitergereicht, die plus eins ist dazu da, die Zeile mit dem Muster zu überspringen.
Wenn Sie mit dem letzten Spiel anstelle des ersten Spiels beginnen möchten, wäre dies:
Beachten Sie, dass nicht alle Versionen von tail die Plus-Notation unterstützen.
quelle
sed -n '/^dog 123 4335$/ { :a; p; n; ba; }' infile
(mit vertauschtem p und n) auch die übereinstimmende Zeile erfolgreich eingeschlossen wird.Wenn Sie eine einigermaßen kurze Datei
grep
haben, könnte dies funktionieren:5000 ist meiner Meinung nach "ziemlich kurz", da es
grep
die erste Übereinstimmung findet und zusammen mit den nächsten 5000 Zeilen ausgibt (die Datei muss nicht so viele enthalten). Wenn Sie das Streichholz selbst nicht wollen, müssen Sie es abschneiden, zWenn Sie nicht die erste, sondern die letzte Übereinstimmung als Trennzeichen wünschen, können Sie dies verwenden:
Diese Zeile liest
animals.txt
in umgekehrter Reihenfolge von Zeilen und Ausgaben bis einschließlich der Zeile mitdog 123 4335
und kehrt dann wieder um, um die richtige Reihenfolge wiederherzustellen.Wenn Sie die Übereinstimmung im Ergebnis nicht benötigen, hängen Sie den Schwanz an. (Sie können den sed-Ausdruck auch komplizieren, um den Puffer vor dem Beenden zu verwerfen.)
quelle
In der Praxis würde ich wahrscheinlich die meiste Zeit Aet3miirahs Antwort verwenden, und Alexeys Antwort ist wunderbar, wenn ich durch die Zeilen navigieren möchte (auch, es funktioniert auch mit
less
). OTOH, ich mag wirklich einen anderen Ansatz (der eine Art der umgekehrten Antwort von Gilles ist :Beim Aufrufen mit dem
-n
Flag werdensed
die von ihm verarbeiteten Zeilen standardmäßig nicht mehr gedruckt. Dann verwenden wir ein 2-Adressen-Formular, das besagt, dass ein Befehl von der übereinstimmenden Zeile/dog 123 4335/
bis zum Ende der Datei (dargestellt durch$
) angewendet werden soll . Es handelt sich um den Befehlp
, der die aktuelle Zeile ausgibt. Das bedeutet also "Drucke alle Zeilen von der einen/dog 123 4335/
bis zum Ende."quelle
dog
Zeile gedruckt , die hier nicht gewünscht ist.sed -n '/dog 123 4335/,$p' | tail -n +2
wird das Spiel auch entfernenWenn Sie das Muster aus einer Datei lesen müssen, setzen Sie es in den Befehl sed ein. Wenn die Datei ein Sed-Muster enthält:
Wenn die Datei eine zu suchende Literalzeichenfolge enthält, setzen Sie alle Sonderzeichen in Anführungszeichen. Ich gehe davon aus, dass die Datei eine einzelne Zeile enthält.
Wenn Sie möchten, dass die Übereinstimmung die gesamte Zeile und nicht nur eine Teilzeichenfolge ist, wickeln Sie das Muster ein
^…$
.quelle
sed
hat0,/dog.../d
dafür.$ more +/"dog 123 4335" file1
quelle
less
.tac
.+
wurde durch-p
in POSIX 7 ersetzt: pubs.opengroup.org/onlinepubs/9699919799/utilities/more.html, aber noch nicht in util-linux 2.20.1 implementiert. Und dies auch drucktskipping..
und einige zusätzliche Zeilen (zu stderr ich denke, so könnte in Ordnung sein).Mit
awk
:quelle
Ein Weg mit awk:
Wobei file2 Ihre Suchmuster enthält. Zunächst wird der gesamte Inhalt von Datei2 im Array "a" gespeichert. Wenn die Datei1 verarbeitet wird, wird jede Zeile mit dem Array verglichen und nur gedruckt, wenn sie nicht vorhanden ist.
quelle
Wenn die Eingabe eine suchbare reguläre Datei ist:
Mit GNU
grep
:Mit
sed
:Eine GNU mit dem
grep
Namen w / the-m
option beendet die Eingabe bei der Übereinstimmung und verlässt die (suchbare) Eingabe fd unmittelbar nach dem Punkt, an dem sie die letzte Übereinstimmung gefunden hat. Wenn Sie alsogrep
w / aufrufen, wird-m1
das erste Vorkommen eines Musters in einer Datei gefunden, und der Eingabeversatz wird genau an der richtigen Stellecat
belassen, damit nach der ersten Übereinstimmung des Musters in einer Datei mit stdout alles geschrieben werden kann.Auch ohne eine GNU
grep
können Sie genau dasselbe mit einer POSIX-kompatiblen tunsed
- wennsed
q
uits angegeben ist, wird der Eingabeversatz dort belassen, wo er ist. GNUsed
ist auf diese Weise jedoch nicht standardkonform und daher funktioniert das oben Genannte wahrscheinlich nicht mit GNU, essed
sei denn, Sie rufen es mit seinem-u
Schalter auf.quelle
sed
hier gezeigte Stream-Freigabe nicht speziell (obwohl der hier angegebene Standard speziellsed
als ein Dienstprogramm bezeichnet wird, das auf diese Weise in der Lage ist) für den gezeigten freien und bedingt kooperativen Workflow ist. Insbesondere sind alle Standarddienstprogramme dafür vorgesehen und spezifiziert, auf diese Weise zusammenzuarbeiten und Cursorpositionen von Eingabeströmen gemeinsam zu nutzen, ohne dass der nächste Leser irgendeine Verarbeitung versäumt.grep -q
sollte dies tun; quietlygrep
sollte zurückkehren, sobald eine Übereinstimmung in der Eingabe gefunden wird, und alle verbleibenden Eingaben sollten standardmäßig nicht verbraucht werden.Meine Antwort auf die Frage im Betreff, ohne Muster in einer zweiten Datei zu speichern. Hier ist meine Testdatei:
GNU sed:
Perl:
Perl-Variante mit Muster in einer Datei:
quelle
Mit
ed
:Dies sendet einen
p
rint-Befehl an ed in einem Here-String. Der Druckbefehl ist in seinem Bereich auf eins nach (+1
) derdog 123 4335
Übereinstimmung bis zum Ende der Datei ($
) beschränkt.quelle
Wenn Ihnen die Erstellung einer temporären Datei nichts ausmacht und
csplit
verfügbar ist, funktioniert Folgendes:Hinweis
file1
ist die Eingabedatei undfile2
ist die Musterdatei (wie in der Frage angegeben).Die lange Form des obigen Befehls lautet:
dh
csplit
ohne dasprefix
obige Flag würde die Datei erstelltxx00
(Präfixxx
und Suffix00
). Mit der Flagge oben wird die Datei erstelltfile1_00
. Ohne dasquiet
Flag wird die Ausgabedateigröße (Größe der resultierenden Datei) gedruckt.quelle
Da awk nicht ausdrücklich abgelehnt wird, gehe ich davon aus, dass "cat" das Match ist.
quelle
Ein anderer Weg, es
sed
auszudrücken, ist "wie man alle Zeilen von der ersten bis zur Übereinstimmung (einschließlich) löscht ", und dies kann geschrieben werden als:quelle
sed -e '0,/MATCH PATTERN/d'
dann?