2008-08-26 79 views
4

有没有办法在bash中的当前行上运行regexp-string替换?Bash reg-exp替换

我经常发现自己处于这种情况,在那里我输入了一个很长的命令行,然后意识到,我想在行中某处改变一个单词。

我目前的做法是,以结束此行,按按Ctrl + 一个(去行的开始),插入#(注释掉线),按回车键,然后使用^oldword^newword语法(^oldword^newword在用旧字替换旧字后执行前一个命令)。

但是,必须有一个更好(更快)的方式来实现这一点。 (鼠标不可能,因为我大部分时间都在ssh会话中)。

可能有一些类似emacs的键盘命令,我不知道。

编辑:我试过使用vi模式。发生了一些奇怪的事情虽然我是一个爱着vim的用户,但我使用我心爱的bash遇到了严重的麻烦。所有那些燃烧到我的潜意识中的手指动作突然停止工作。我很快回到了emacs模式,并考虑给emacs尝试一下我最喜欢的编辑器(尽管我猜,同样的事情可能会再次发生)。

回答

1

不幸的是,没有,没有更好的方法。如果你只是厌倦了击键,你可以使用宏来修剪它们。以下添加到您的~/.inputrc

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

现在,在一个新的bash实例(或按C-x C-r在当前的shell重装.inputrc后),您可以执行以下操作:

  1. 键入一个假的命令(例如,ls abcxyz)。
  2. 按Ctrl-x,然后6.该宏在该行的开头插入一个#,执行注释行并键入您的第一个^。 (请输入xyz^def)。
  3. 按Ctrl-x,然后按7.该宏完成您的替换,然后上一行(注释)行,删除注释字符,并再次执行它。

这不完全是优雅的,但我认为这是最好的,你会用readline得到。

3

G'day,

那么使用vi模式呢?只要输入设置-o vi

然后,你可以去你想改变的单词,只要做一个CW或CW取决于什么是在这个词?

糟糕,忘记添加你输入一个ESC k到o到命令历史记录中的上一行。

你通常使用什么编辑器?

欢呼声, 罗布

编辑:我忘了我原来的答复说的是,你需要使用的时候你是在“前”模式下,你输入的命令在bash认为vi命令行vi,即在输入冒号后。

最糟糕的是,你需要使用h(左)和l(右)古老的vi命令来浏览命令历史。你可以使用w(或W)来跨越单词反弹。

一旦你习惯了它,你可以使用各种命令,例如,进入ESC/my_command会回顾你的历史,最近的第一个,找到包含文本my_command的命令行的第一个出现。一旦找到了,你可以使用n来查找下一个发生等,并且N可以反转搜索的方向。

我会去阅读bash的手册页,看看在vi模式下有什么可用的。一旦你了解到向上箭头和向下箭头被ESC k和j替代的事实,你会发现vi模式提供了比bash中的命令行编辑更多的emacs模式。

恕我直言natchurly! ( - :

Emacs?八十megs和不断交换!

欢呼声, 罗布

3
在KSH

,在vi模式下,如果你打“V”,而在命令模式下它会在你的当前命令行的内容生成一个完整的vi会话。然后,您可以使用全部的vi命令进行编辑(全局搜索和替换)。何时:从vi输入wq,执行编辑后的命令。我相信类似的东西存在bash。由于bash倾向于扩展它的前辈,所以可能有类似的东西。

+0

它确实也适用于Bash,我想说当你想用你当前的命令行完成全面的“编辑器”时,这是最好的答案。 – jwd 2016-08-17 21:46:12