Bash reg-exp替换

时间:2008-08-26 14:37:32

标签: regex bash

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

我经常在这种情况下找到自己,在那里我输入了一个长命令行,然后意识到,我想在一行的某个地方改变一个词。

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

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

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

编辑:我尝试过使用vi-mode。发生了一件奇怪的事。虽然我是一个充满爱心的用户,但是使用我心爱的bash时我遇到了很大的麻烦。所有那些已经被我的潜意识烧伤的手指动作突然停止了工作。我很快回到了emacs-mode并考虑过,给emacs一个尝试作为我最喜欢的编辑器(虽然我猜,同样的事情可能会再次发生)。

3 个答案:

答案 0 :(得分: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中的命令行编辑。

恕我直言! ( - :

的Emacs?八十megs并不断交换!

欢呼声, 罗布

答案 1 :(得分:3)

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

答案 2 :(得分: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.宏在行的开头插入#,执行注释行,然后键入您的第一个^
  3. 输入您的更正(例如xyz^def)。
  4. 按Ctrl-x,然后按7.宏完成替换,然后转到上一个(注释)行,删除注释字符,然后再次执行。
  5. 这不是很优雅,但我认为这是你用readline获得的最佳效果。