Wie suche ich über mehrere Zeilen nach einer Phrase? ZB Lets haben die Phrase "mein Eistee", dann kann es in Textdateien eingewickelt werden:
as js skdfh dfh djh sf my
ice tea.
grep stimmt nicht überein, da dazwischen ein Zeilenumbruch steht. Wie passe ich diese an? Ein weiteres mehrzeiliges Muster wärepattern1_\n_pattern2
Ich weiß, dass der einfachste Weg, wie ich Geldautomaten mache, darin besteht, nur einen Teil zu greifen, z. Das ist aber sehr mühsam. Ich bin also interessiert, wie Sie das lösen könnten.
Antworten:
Sie könnten installieren
pcregrep
(in den meisten Distributions-Repositories verfügbar) - was grep unter Verwendung der pcre-Bibliothek ist , die "Perl-kompatible reguläre Ausdrücke" ausführt . Es verfügt über eine Befehlszeilenoption, mit-M
der Sie mehrzeilige Suchen durchführen können - über die Manpage :Also könntest du tun
Das
\s
ist Leerzeichen, das wird passen\n
und\r
in mehrzeiligen Modus, zusätzlich zu den normalen Leerzeichen. Sie können das Zeilenumbruchzeichen auch direkt abgleichenquelle
grep -E
pcre Muster nicht??
,+
,{
,|
,(
, und)
als ihre übliche regex Bedeutung ohne eine haben, die\
vor, wie Sie tun , wenn Sie Standard grep verwenden. Istgrep 'hello\s\+world' file
also gleichbedeutend mitgrep -E 'hello\s+world' file
. PCRE funktioniert nicht. Es gibtgrep -P
für Perl reguläre Ausdrücke, aber es ist experimentell (gemäß der Manpage) und ich denke, es ist ein wenig anders als pcregrep ...-P
als ich sagte-E
, aber ich habe nicht bemerkt, dass es anders ist.Ich würde wahrscheinlich eine Suche mit
vim
's:vimgrep
Befehl durchführen. Dies funktioniert auf eine Art und Weise, die der vongrep
REs und Pfaden vage ähnlich ist, diese aber unterstützt.Grundsätzlich führen Sie so etwas wie
:vimgrep 'pattern1\npattern2' path/**
eine rekursive Suche aus und:copen
rufen dann ein kleineres Fenster mit einer Liste von Übereinstimmungen auf.vim
REs können fast alles, was PCREs können, aber sie haben sich unabhängig von der Perl-Linie der regulären Ausdrücke entwickelt, sodass die meisten fortgeschrittenen Dinge anders funktionieren. Ihre Grundfunktionalität ähnelt eher der von grundlegenden REs, aber sie haben einige raffinierte Ergänzungen, die PCREs nicht bieten.Ich bin nicht sicher, ob es möglich ist
:vimgrep
, Daten so auszuspucken, wie es dergrep
Fall ist. Ich habe immer nur versucht, es für die Navigation innerhalb zu verwendenvim
.:help vimgrep
von innenvim
für mehr Infos;:help pattern.txt
für Informationen zuvim
REs; Weitere Informationen zu Pfaden finden Sie unter:help wildcards
.quelle
.vimrc
? Es sollte portabler sein alsgrep
in Bezug auf das Betriebssystem: Esvim
hat keine "POSIX-Variante" und funktioniert auch unter Windows mehr oder weniger identisch. .................................................. ........................... Es ist jedoch möglich, Qualifikationsmerkmale hinzuzufügen, um sicherzustellen, dass z. B. die richtige Menge an "Magie" in der RE verwendet wird Soweit ich weiß, gibt es eine strenge ungeschriebene Regel, um diese Option in Ruhe zu lassen.find.exe
anstelle vongrep
). In den letzten Wochen gab es eine andere Frage, die dieses Problem hatte.:vimgrep
oder:grep
? Von:help grep
: "Der Vorteil des internen grep [ie:vimgrep
] ist, dass es auf allen Systemen funktioniert und die leistungsstarken Vim-Suchmuster verwendet."Grep funktioniert jeweils nur in einer Zeile, aber Sie können awk verwenden, um Zeilen zu drucken, die mit einer Reihe von Mustern übereinstimmen:
es würde alles zusammenpassen, nicht nur Zeilenumbrüche zwischen den beiden Mustern
quelle
Um das Beste aus Unix herauszuholen, müssen Sie die Vorteile von Pipes nutzen. Sie können dies in einfachen
grep
Rohren tun (kein Abschlag erforderlich):Was ich nicht als mühsam empfinde.
quelle