有没有办法在 bash 的当前行上运行正则表达式字符串替换?

我发现自己经常遇到这样的情况:我输入了很长的命令行,然后意识到我想更改该行中的某个单词。

我当前的方法是完成该行,按 控制键+A (到达行的开头),插入#(注释掉该行),按 Enter 键,然后使用 ^oldword^newword 句法 (^oldword^newword 用 newword 替换 oldword 后执行上一条命令)。

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

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

编辑:我尝试过使用 vi 模式。奇怪的事情发生了。虽然我是一名热爱 vim 的用户,但在使用我心爱的 bash 时却遇到了严重的问题。所有那些已经烙印在我潜意识里的手指动作突然停止了。我很快回到了 emacs 模式并考虑了一下,尝试一下 emacs 作为我最喜欢的编辑器(尽管我猜,同样的事情可能会再次发生)。

有帮助吗?

解决方案

不幸的是,没有,没有更好的方法。如果您只是厌倦了敲击键盘,您可以使用宏来减少敲击键盘的次数。将以下内容添加到您的 ~/.inputrc:

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

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

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

它并不完全优雅,但我认为这是使用 readline 所能得到的最好的结果。

其他提示

在 ksh 中,在 vi 模式下,如果您在命令模式下按“v”,它将在当前命令行的内容上生成一个完整的 vi 会话。然后,您可以使用全套 vi 命令进行编辑(根据您的情况进行全局搜索和替换)。当从 vi 中使用 :wq 时,将执行编辑的命令。我确信 bash 也存在类似的东西。由于 bash 倾向于扩展其前身,因此可能有类似的东西。

你好,

使用 vi 模式怎么样?只需输入 set -o vi

然后,您可以转到要更改的单词,然后根据单词中的内容执行 cw 或 cW 操作?

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

您通常使用什么编辑器?

欢呼,罗布

编辑:我在原来的回复中忘记说的是,您需要考虑 bash 中的 vi 命令行,使用您在 vi 中处于“ex”模式时输入的命令,即当你进入结肠后。

最糟糕的是,您需要使用古老的 vi 命令 h(向左)和 l(向右)来浏览命令历史记录。不过,您可以使用 w(或 W)在单词之间跳转。

一旦你习惯了它,你就可以使用各种命令,例如输入 ESC / my_command 将回顾您的历史记录,最近的在前,以查找第一次出现的包含文本 my_command 的命令行。一旦找到,您就可以使用 n 查找下一个出现的情况,依此类推。N 则反转搜索方向。

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

恕我直言,自然!(-:

Emacs?八十兆并不断交换!

欢呼,罗布

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top