2008-08-26 12 views
4

Existe-t-il un moyen d'exécuter une chaîne regexp remplacer sur la ligne en cours dans le bash?Bash reg-exp de substitution

je me trouve assez souvent dans la situation où j'ai tapé une longue et réaliser commandline, que je voudrais changer un mot quelque part dans la ligne.

Mon approche actuelle est de terminer la ligne, appuyez sur Ctrl + A (pour arriver au début de la ligne), insérer un # (pour commenter la ligne), appuyez sur Entrée, puis utilisez le ^oldword^newword La syntaxe (^oldword^newword exécute la commande précédente après avoir remplacé oldword par newword).

Mais il doit y avoir une meilleure façon (plus rapide) d'y parvenir. (La souris n'est pas possible, puisque je suis dans une ssh-sessions la plupart du temps).

Il y a probablement une commande clé semblable à emacs pour cela, que je ne connais pas.

Éditer: J'ai essayé d'utiliser le mode vi. Quelque chose d'étrange est arrivé. Bien que je sois un vim-utilisateur aimant, j'ai eu de sérieux problèmes à utiliser mon bash bien-aimé. Tous ces mouvements de doigts qui ont été brûlés dans mon subconscient ont soudainement cessé de fonctionner. Je suis rapidement retourné en mode emacs et considéré, en donnant à emacs un essai en tant que mon éditeur préféré (bien que je suppose, la même chose pourrait se reproduire).

Répondre

1

Malheureusement, non, il n'y a pas vraiment de meilleur moyen. Si vous êtes fatigué de faire les frappes, vous pouvez utiliser des macros pour les réduire. Ajoutez ce qui suit à votre ~/.inputrc:

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

Maintenant, dans une nouvelle instance de bash (ou après le rechargement .inputrc dans votre shell courant en appuyant sur C-x C-r), vous pouvez effectuer les opérations suivantes:

  1. Tapez un faux commande (par exemple ls abcxyz).
  2. Appuyez sur Ctrl-x, puis sur 6. La macro insère un # au début de la ligne, exécute la ligne commentée et tape votre premier ^. Saisissez votre correction (par exemple xyz^def).
  3. Appuyez sur Ctrl-x, puis sur 7. La macro complète votre substitution, puis remonte à la ligne précédente (commentée), supprime le caractère de commentaire et l'exécute à nouveau.

Ce n'est pas vraiment élégant, mais je pense que c'est le meilleur que vous obtiendrez avec readline.

3

G'day,

Qu'en est-il de l'utilisation de vi mode à la place? ENTREZ SIMPLEMENT set -o vi

Ensuite, vous pouvez aller au mot que vous voulez changer et juste faire un cw ou cW en fonction de ce qui est dans le mot? Oups, vous avez oublié d'ajouter un ESC k à o à la ligne précédente dans l'historique des commandes.

Que utilisez-vous normalement pour un éditeur?

acclamations, Rob

Edit: Ce que j'oublié de dire dans ma réponse initiale était que vous devez penser à la ligne de commande vi dans bash en utilisant les commandes que vous entrez lorsque vous êtes en mode « ex » vi, c'est-à-dire après avoir entré le côlon.

pire chose est que vous devez vous déplacer à travers l'histoire de votre commande en utilisant les anciennes commandes vi de h (à gauche) et l (à droite). Vous pouvez utiliser w (ou W) pour faire rebondir les mots. Une fois que vous vous êtes habitué à cela, vous avez toutes sortes de commandes disponibles, par ex. En entrant ESC/my_command vous regarderez dans votre historique, le plus récent en premier, pour trouver la première occurrence de la ligne de commande contenant le texte my_command. Une fois qu'il a trouvé cela, vous pouvez alors utiliser n pour trouver l'occurrence suivante, etc. Et N pour inverser la direction de la recherche.

Je voudrais avoir une lecture de la page de manuel de bash pour voir ce qui est disponible en mode vi. Une fois que vous avez surmonté le fait que la flèche vers le haut et la flèche vers le bas sont remplacées par ESC k, puis j, vous verrez que le mode vi offre plus que le mode emacs pour l'édition de ligne de commande dans bash.

À mon humble avis! (-:

Emacs? Quatre-vingts méga-octets et permuter constamment!

acclamations, Rob

3

en ksh, en mode vi, si vous appuyez sur « v » en mode de commande, il engendrera une session complète de vi sur le contenu de votre ligne de commande en cours. Vous pouvez ensuite éditer en utilisant la gamme complète de commandes vi (recherche globale et remplacer dans votre cas). Quand: wq de vi, la commande éditée est exécutée. Je suis sûr que quelque chose de similaire existe pour bash. Puisque bash a tendance à étendre ses prédécesseurs, il y a probablement quelque chose de similaire.

+0

Il fonctionne en effet avec Bash, aussi, et je dirais que c'est la meilleure réponse quand on veut faire des trucs d'éditeur à part entière avec votre ligne de commande actuelle. – jwd