Re: regex fuer zwei Begriffe mit UND Verknuepfung

From: Marc Santhoff <M.Santhoff(at)t-online.de>
Date: Sat, 11 Feb 2006 16:22:42 +0100

Am Samstag, den 11.02.2006, 13:59 +0100 schrieb Oliver Fromme:
> Marc Santhoff <M.Santhoff(at)t-online.de> wrote:
> > Oliver Fromme wrote:
> > > Du möchtest also aus einer Reihe von Dokumenten diejenigen
> > > heraussuchen, die zwei bestimmte Begriffe enthalten, und
> > > zwar nicht zwangsläufig in derselben Zeile. Das geht so:
> > >
> > > grep -l Begriff1 *.txt | xargs grep -l Begriff2
> > >
> > > Das liefert die Die betreffenden Dateinamen.
> >
> > Genau an sowas hatte ich gedacht. Ggf. noch mit "find" vorweg.
>
> Ja, das kommt dann auf diverse Dinge an.
>
> Ich erlaube mir mal einen kleinen Shell-Exkurs. :-)

Gern.

> Erstens kommt es darauf an, wieviele Dateien es sind (oder
> sein können). Wenn es extrem viele sein können, könnte die
> Grenze von execve() gesprengt werden.

Ist hier der Fall, sonst würd' ich's auch ohne Werkzeugunterstützung
finden. ;)

> Da »echo« ein Shell-builtin ist, unterliegt er nicht dem
> execve()-Limit, und xargs(1) sorgt dann dafür, daß die Ar-
> gumente in verdauliche Happen aufgeteilt werden. Man kann
> natürlich auch find(1) hernehmen (ebenfalls mit xargs),
> wobei man dann »-maxdepth 1« angeben muß, falls man nicht
> rekursiv suchen möchte. Im allgemeinen ist in dem Fall
> aber echo einfacher und schneller als find.

Der eigentliche Trick bei der Sache, auf den ich nicht so schnell
gekommen wäre, ist xargs zu benutzen.

> Womit wir schon beim zweiten Punkt wären: ob man rekursiv
> in einem ganzen Verzeichnisbaum suchen möchte oder nicht.
> Bei rekursiver Suche muß man im allgemeinen natürlich schon
> find(1) hernehmen, z.B.
>
> find . -type f -name '*.txt' | xargs grep ...
>
> oder:
>
> find . -type f | grep '\.txt$' | xargs grep ...

Auf jeden Fall rekursiv, '\.txt$' bedeutet 'alle Dateinamen mit der
Zeichenkette '.txt' am Ende, wenn ich richtig verstehen.

> Drittens hängt es auch von den Fähigkeiten der Shell ab.
> Da ich die zsh verwende, die bereits rekursives Globbing
> und Filtern nach Dateitypen unterstützt (und diverse ande-
> re Dinge), brauche ich in vielen Fällen gar kein find(1).
> Obiges kann man in zsh auch einfach so machen:
>
> echo **/*(.) | xargs grep ...

Das ist natürlich wirklich elegant, aber mit csh wird das wohl nix.
Insgesamt gewöhne ich mir auch lieber portable Formen von von Kommandos
an.

> > > Mir ist kein
> > > GUI-Programm bekannt, das derartiges leistet; zumindest
> > > ist keines per default mit einem der gängigen GUIs (KDE,
> > > Gnome, Windows) installiert.
> >
> > Nein, dafür gibt es kein GUI. Aber auch als Konsolbefehl ist es nicht so
> > besonders intuitiv.
>
> Hm. Ich finde es eigentlich schon recht intuitiv.

Nun ja, im Vergleich mit anderen Kommandos vielleicht. Die Schwierigkeit
für mich ist eigentlich, daß ich normalerweise ohne viel Shellbetrieb
arbeite (außer bei Aktionen wie ifconfig, mount, ...), und wenn ich mal
was besonderes brauche, hab's ich es wieder vergessen. Aber die Suche
nach mehreren Begriffen wird auf jeden Fall als kleines Skript
festgehalten.

Danke für die Erhellung,
Marc

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sat 11 Feb 2006 - 16:22:59 CET

search this site