2008-08-26 6 views
4

Gibt es eine Möglichkeit, eine Regexp-String-Ersetzung auf der aktuellen Zeile in der Bash auszuführen?Bash-Reg-Exp-Substitution

Ich finde mich ziemlich oft in der Situation, wo ich eine lange Kommandozeile eingegeben habe und dann merke, dass ich irgendwo in der Zeile ein Wort ändern möchte.

Mein aktueller Ansatz ist es, die Linie zu beenden, drücken Ctrl + A (zum Anfang der Zeile zu erhalten), legen Sie eine # (um die Zeile aus kommentieren), drücken Sie die Eingabetaste und dann die ^oldword^newword verwenden Syntax (^oldword^newword führt den vorherigen Befehl nach dem Ersetzen von oldword durch newword aus).

Aber es muss einen besseren (schneller) Weg geben, dies zu erreichen. (Die Maus ist nicht möglich, da ich die meiste Zeit in einer SSH-Sitzung bin).

Wahrscheinlich gibt es dafür einen Emacs-ähnlichen Tastenbefehl, von dem ich nichts weiß.

Edit: Ich habe versucht mit vi-Modus. Etwas Komisches ist passiert. Obwohl ich ein liebender Vim-User bin, hatte ich ernsthafte Probleme mit meinem geliebten Bash. All diese Fingerbewegungen, die in mein Unterbewusstsein eingebrannt waren, hörten plötzlich auf zu arbeiten. Ich kehrte schnell in den Emacs-Modus zurück und dachte darüber nach, Emacs als meinen Lieblingsredakteur auszuprobieren (obwohl ich denke, dass das Gleiche wieder passieren könnte).

Antwort

1

Leider, nein, es gibt nicht wirklich einen besseren Weg. Wenn Sie die Tastenanschläge nicht mehr brauchen, können Sie sie mit Makros abschneiden. Fügen Sie den folgenden Code zu Ihrem ~/.inputrc:

"\C-x6": "\C-a#\C-m^" 
"\C-x7": "\C-m\C-P\C-a\C-d\C-m" 

nun in einem neuen bash-Instanz (oder nach Drücken C-x C-r.inputrc in der aktuellen Shell-Neuladen), können Sie wie folgt vorgehen:

  1. Typ eine gefälschte Befehl (zB ls abcxyz).
  2. Drücken Sie Strg-X, dann 6. Das Makro fügt am Anfang der Zeile eine # ein, führt die kommentierte Zeile aus und gibt Ihre erste ^ ein.
  3. Geben Sie Ihre Korrektur ein (z. B. xyz^def).
  4. Drücken Sie Strg-x, dann 7. Das Makro vervollständigt Ihre Ersetzung, geht dann zur vorherigen (kommentierten) Zeile, entfernt das Kommentarzeichen und führt es erneut aus.

Es ist nicht gerade elegant, aber ich denke, es ist das Beste, was du mit readline bekommst.

3

G'day,

Wie wäre es stattdessen mit dem vi-Modus? Geben Sie einfach set -o vi ein

Dann können Sie zu dem Wort gehen, das Sie ändern möchten und tun Sie einfach ein cw oder cW je nachdem, was in dem Wort ist?

Hoppla, vergessen Sie hinzuzufügen, geben Sie ein ESC k bis o zur vorherigen Zeile in der Befehlsgeschichte.

Was verwenden Sie normalerweise für einen Editor?

prost, Rob

Edit: Was ist in der Ich habe vergessen, in meiner ersten Antwort zu sagen war, dass man von der vi-Befehlszeile in bash zu denken, müssen die Befehle Sie eingeben, wenn Sie in „ex“ Modus vi, dh nachdem Sie den Doppelpunkt eingegeben haben.

Am schlimmsten ist es, dass Sie sich mit den alten vi-Befehlen h (nach links) und l (nach rechts) durch Ihren Befehlsverlauf bewegen müssen. Sie können w (oder W) verwenden, um über Wörter zu springen.

Sobald Sie sich jedoch daran gewöhnt haben, haben Sie alle Arten von Befehlen zur Verfügung, z. Wenn Sie ESC/my_command eingeben, wird in Ihrem Verlauf (zuletzt der neueste) nach dem ersten Vorkommen der Befehlszeile mit dem Text my_command gesucht. Sobald es das gefunden hat, können Sie dann n verwenden, um das nächste Vorkommen usw. zu finden. Und N, um die Suchrichtung umzukehren.

Ich würde gehen, lesen Sie die man-Seite für bash, um zu sehen, was im vi-Modus verfügbar ist. Sobald Sie über die Tatsache, dass Pfeil nach oben und Pfeil nach unten durch ESC k und dann j ersetzt werden, werden Sie sehen, dass vi-Modus bietet mehr als Emacs-Modus für die Befehlszeile Bearbeitung in bash.

IMHO natchurly! (-:

Emacs? Achtzig Megas und ständig austauschen!

prost, Rob

3

in KSH, in vi-Modus, wenn Sie ‚v‘ zu schlagen, während im Kommando-Modus wird es eine volle vi-Sitzung über den Inhalt der aktuellen Befehlszeile laichen. Sie können dann mit den gesamten vi-Befehlen bearbeiten (globale Suche und ersetzen in Ihrem Fall). Wenn: wq von vi, wird der bearbeitete Befehl ausgeführt. Ich bin sicher, dass etwas ähnliches für Bash existiert. Da bash dazu neigt, seine Vorgänger zu erweitern, gibt es wahrscheinlich etwas Ähnliches.

+0

Es funktioniert in der Tat auch mit Bash, und ich würde sagen, das ist die beste Antwort, wenn Sie mit Ihrer aktuellen Kommandozeile vollwertige "Editor-Sachen" machen wollen. – jwd