grep und vi kombinieren (SunOS 5.9)

m3000

Erfahrenes Mitglied
Hallo,

ein ständig wiederkehrender Arbeitsablauf ist es, zunächst in Dateien nach einem String zu suchen. Und dann die gefundenen Dateien mit dem vi zu öffnen und zu bearbeiten. Der zweite Schritt geht erst, indem ich die Dateinamen-Treffer mit copy&paste in die vi-Aufrufzeile übernehme.
Wie kann ich das automatisieren (SunOS 5.9)? Also in einem Befehl/Kurzskript sagen: "Öffne mir die Dateien mit dem vi, die den String xyz enthalten."

Dank und Gruss
Marcus
 
Hallo,

im vim:
Code:
:help grep

Konkretes Beispiel:

1.) vim oeffnen
2.)
Code:
 :grep main *.c
3.)
Code:
 :cnext bzw :cprev
um in der Trefferliste zurueck bzw vorzuspringen

btw cnext und cprev kannst du auch auf eine Taste mappen...

Gruß

RedWing
 
Hallo,

1.) wieso installierst du vim nicht einfach?
2.) geht das denn im "uralten" vi nicht auch?
3.) Falls du 1. und 2. negativ beantworten solltest waere das noch ein unbefriedigender Workaround:

Code:
vi `grep main *.c  | sed -e 's/\(.*\):.*/\1/g'`

Gruß

RedWIng
 
RedWing hat gesagt.:
1.) wieso installierst du vim nicht einfach?
2.) geht das denn im "uralten" vi nicht auch?
Ich bin hier nur einer von vielen Anwendern auf der Maschine. Installieren kann ich nicht und darf ich nicht. Leider. Und im vi klappt's nicht, ich hab's getestet. Meldung: "grep: Not an editor command"

RedWing hat gesagt.:
3.) Falls du 1. und 2. negativ beantworten solltest waere das noch ein unbefriedigender Workaround:

Code:
vi `grep main *.c  | sed -e 's/\(.*\):.*/\1/g'`
Ach, so unbefriedigend ist das für mich nicht, klappt doch. Ich versuche dann noch, das mit Variable für den String in einen alias zu packen (scheitert noch am Anführungszeichen).
Aber einen Optimierungswunsch hätte ich noch: Kann man so eine Art "distinct" einbauen? So dass also eine Datei nur einmal geöffnet wird, auch wenn die gesuchte Zeichenkette mehrmals vorkommt?

Vielen Dank schon mal,
Marcus

PS: Ja, stimmt, meine Skript-Kenntnisse tendieren gegen Null.
 
Hi.

Du kannst dem grep die Option -l übergeben, da werden die Dateien nur aufgelistet sobald der gesuchte reg. Ausdruck darin vorkommt. /edit: Dann kannst du auch den sed Aufruf weglassen.

Was verwendest du denn für eine Shell? In der Bash kann man keine Parameter an einen Alias übergeben. Da müßtest du schon eine Funktion schreiben.

Gruß
 
Zuletzt bearbeitet:
Nur so als Anmerkung:

Ich bin hier nur einer von vielen Anwendern auf der Maschine. Installieren kann ich nicht und darf ich nicht. Leider.

Hast du denn kein Homeverzeichniss. Du koenntest den vim einfach zu dir ins Homeverzeichniss
installieren und dann einen alias setzen.
Wenn du grep mit dem vi benutzen willst, ist das builtin grep vom vim 10mal komfortabler...

Gruß

RedWing
 
Hallo,
deepthroat hat gesagt.:
Du kannst dem grep die Option -l übergeben, da werden die Dateien nur aufgelistet sobald der gesuchte reg. Ausdruck darin vorkommt. /edit: Dann kannst du auch den sed Aufruf weglassen.
Fantastisch! Das ist es, was ich gesucht habe. Ich fasse noch mal zusammen:
Code:
vi `grep -l <GesuchterString> * -R`
Winziger Nachteil nur: Wenn es gar keinen grep-Treffer gibt, kommt keine plausible Meldung mehr, sondern es rauscht kurz grep: can't open -R durch. Das ist mir jetzt aber Wurst.
------------------------

Zur neuen alias-Problematik:

deepthroat hat gesagt.:
Was verwendest du denn für eine Shell? In der Bash kann man keine Parameter an einen Alias übergeben. Da müßtest du schon eine Funktion schreiben.
Ich bin in der csh, bzw. ich erweitere als erste Tat jeder Session auf tcsh. Da wir schon dabei sind: Geht das dann? Wie?
 
Ja, das dachte ich mir schon das da die (t)csh eingesetzt wird. Ich finde ja die csh ist das schlimmste was es gibt (zum Benutzen und vor allem Programmieren) - und die tcsh ist nicht viel besser. Ich hab mir deswegen eine cshrc gebastelt die mich automatisch in eine Bash einloggt. So, das mußte mal raus :-)

In der (t)csh gibt es keine Funktionen, aber man kann die History Substitution in den Alias benutzen:
Code:
alias vigrep 'vi `grep -l \!*`'
Das kannst du dann so benutzen:
Code:
$ vigrep '[foo][bar]*' *.c *.h *.cc
Ein weiterer Nachteil ist, das es nicht für Dateien mit Sonderzeichen im Namen funktioniert.

Gruß
 
Vielen Dank, alles gut. Und metasyntaktische Variablen habe ich auch noch kennen gelernt...

Gruss
Marcus
 
Zurück