4

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

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

我目前的做法是完成该行,按Ctrl+ A(到达行首),插入一个#(注释掉该行),按回车然后使用^oldword^newword语法(^oldword^newword用新词替换旧词后执行上一个命令)。

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

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

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

4

3 回答 3

3

天,

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

然后你可以找到你想要改变的单词,然后根据单词中的内容做一个 cw 或 cW 吗?

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

你通常用什么来做编辑?

干杯,罗伯

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

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

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

我会阅读 bash 的手册页以查看在 vi 模式下可用的内容。一旦你克服了向上箭头和向下箭头被 ESC k 和 j 替换的事实,你会发现 vi 模式提供了比 emacs 模式更多的 bash 命令行编辑功能。

恕我直言!(-:

埃马克斯?八十兆和不断交换!

干杯,罗伯

于 2008-08-26T14:40:23.683 回答
3

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

于 2008-08-26T15:33:57.987 回答
1

不幸的是,不,没有更好的方法。如果您只是厌倦了击键,您可以使用宏来修剪它们。将以下内容添加到您的~/.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。宏#在行首插入 a,执行注释行,然后键入您的第一个^.
  3. 输入您的更正(例如,xyz^def)。
  4. 按 Ctrl-x,然后按 7。宏完成替换,然后转到上一行(已注释),删除注释字符,然后再次执行。

It's not exactly elegant, but I think it's the best you're going to get with readline.

于 2008-09-22T05:02:38.877 回答