Manipulation de l’historique BASH: search replace

0

Il existe une fonction d’expansion de paramètre / variable très pratique dans BASH que je ne vois pas dans l’historique. J'ai vérifié les pages de manuel pour l'historique et pour BASH lui-même. Pas là ... peut-être que j'ai raté ça.

Exemple: j'utilise beaucoup ssh et je peux le faire avec une expansion variable.

host=foo@bar.org

Supposons que je veuille extraire uniquement l'hôte. Supprimez plutôt le nom d'utilisateur.

hostonly=${host##*@}

Si je

echo $hostonly

Je reçois:

bar.org

Ma question: Est-il possible de faire cela avec l'historique en ligne de commande?

par exemple.,

Commande 1:

ssh foo@bar.org

Commande 2:

ssh gary@!!:##*@

Bien sûr, cela ne fonctionne pas, mais quelqu'un peut-il confirmer si ce type de correspondance de modèle est disponible?

Merci!

Bubnoff

Bubnoff
la source
Dans mes exemples, il n’est pas particulièrement avantageux de faire ce que je demande. Oubliez le nombre de caractères - je m'interroge sur le support des regex dans la substitution d'historique bash. Peut-il fonctionner de manière similaire aux variables, en d'autres termes. Je connais la s & r rapide avec des caractères ainsi que la forme !!: s ///. Désolé pour la confusion!
Bubnoff

Réponses:

2

La rcommande (qui est elle-même un cas particulier de la fccommande) est une astuce souvent manquée par les gens :

$ ssh foo@bar.org
(...)
$ r foo=baz

Le cas plus général est

$ fc -s foo=bar ssh

qui vous permet de sélectionner une commande de l’historique par sous-chaîne, puis d’effectuer la substitution spécifiée et de l’exécuter. Si vous laissez cette option -s, la commande sera chargée $EDITORpour une modification plus complexe; l'édition de ligne de commande rend la plupart du temps inutile, mais certaines modifications sont difficiles à effectuer sur la ligne de commande.

Vous pouvez également effectuer des manipulations assez complexes à l'aide de la !syntaxe de référence d'historique, mais pour des raisons historiques (le mécanisme d'historique de base a été établi par le passé cshet toutes les améliorations ont pour la plupart conservé la compatibilité), il utilise une syntaxe différente. Voir ici pour plus de détails.

geekosaur
la source
2
rest un alias qui a probablement besoin d'être défini (certaines installations peuvent l'inclure par défaut dans .bashrc). fctoujours seulement les substitutions de chaînes (il ne supporte pas les caractères génériques).
Dennis Williamson
2
Cela dépendra également de la bashversion; ra été hérité de ksh, et bash4 semble enlever tous les ksh-ismes.
geekosaur
0
$ ssh foo@bar.org
...
$ ^foo^gary^
...

La commande est répétée en utilisant "gary" comme nom d'utilisateur au lieu de "foo". Ce qui suit fonctionne de la même manière:

$ ssh foo@bar.org
...
$ !!:s/foo/gary/
...
Dennis Williamson
la source
J'étais au courant de ces méthodes. Mais selon les chaînes, les caractères génériques seraient beaucoup plus rapides. Quelle est l’assistance regex pour des exemples comme le second?
Bubnoff
Le dernier signe est inutile dans l'exemple un
Bubnoff
1
@Bubnoff: Malheureusement, la substitution d'historique Bash ne prend pas en charge les caractères génériques. Zsh, cependant, fait.
Dennis Williamson
@Bubnoff: La dernière barre oblique est également inutile dans le deuxième exemple.
Dennis Williamson