Bash正则表达式替换
有没有一种方法可以在bash中的当前行上运行regexp-string替换?
我经常遇到这样的情况:我打了一个长长的命令行,然后意识到,我想在命令行中的某个地方更改一个单词。
我当前的方法是结束行,按Ctrl + A(到达行的开头),插入a(注释掉行),按Enter,然后使用^ oldword ^ newword语法(^ oldword ^ newword
在用oldword替换oldword之后执行上一个命令)。
但是必须有一种更好(更快)的方法来实现这一目标。 (鼠标是不可能的,因为大部分时间我都处于ssh会话中)。
可能有一些我不知道的类似emacs的键盘命令。
编辑:我尝试使用vi模式。发生了一些奇怪的事情。尽管我是一个喜欢vim的用户,但在使用我心爱的bash时遇到了严重的麻烦。所有那些被烧入我的潜意识的手指动作突然停止了工作。我很快回到了emacs模式并考虑了一下,尝试以emacs作为我最喜欢的编辑器(尽管我想,同样的事情可能会再次发生)。
解决方案
回答
G'day,
改用vi模式呢?只需输入set -o vi
然后,我们可以转到要更改的单词,然后根据单词的含义进行连续或者连续操作。
糟糕,忘记添加,请在命令历史记录的前一行中将ESC k输入到o。
我们通常为编辑器使用什么?
干杯,
抢
编辑:我在原始答复中忘记了说的是,我们需要使用在vi中处于" ex"模式(即输入冒号后)时输入的命令来思考bash中的vi命令行。
最糟糕的是,我们需要使用古老的vi命令h(向左)和l(向右)在命令历史中四处移动。不过,我们可以使用w(或者W)在单词之间跳动。
不过,一旦习惯了,就可以使用各种命令,例如输入ESC / my_command将回顾历史记录(最近一次),以查找包含文本my_command的命令行的第一个出现位置。一旦找到,则可以使用n查找下一个出现的事件,等等。使用N可以反转搜索的方向。
我将阅读bash的手册页,以了解在vi模式下可用的内容。一旦我们克服了向上箭头和向下箭头被ESC k和j所取代的事实,我们将发现vi模式比emacs模式提供了更多的bash命令行编辑功能。
恕我直言natchurly! (-:
Emacs?八十兆,不断交换!
干杯,
抢
回答
在ksh中,在vi模式下,如果在命令模式下按下'v',它将在当前命令行的内容上生成完整的vi会话。然后,我们可以使用全部vi命令进行编辑(根据情况进行全局搜索和替换)。从vi进行:wq时,将执行已编辑的命令。我确信bash存在类似的东西。由于bash倾向于扩展其前身,因此可能存在类似的情况。
回答
不幸的是,没有,没有真正更好的方法。如果我们只是厌倦了按键操作,则可以使用宏来缩小按键范围。将以下内容添加到〜/ .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
之后),我们可以执行以下操作:
- 输入伪造的命令(例如," ls abcxyz")。
- 按Ctrl-x,然后按6. 宏将在行的开头插入#,执行注释行,然后键入第一个^。
- 输入更正内容(例如" xyz ^ def")。
- 按Ctrl-x,然后按7. 宏完成替换,然后转到上一行(带注释),删除注释字符,然后再次执行。
它并不完全优雅,但我认为这是我们将通过readline获得的最佳体验。