![如何一步将“8”替换为“7”?](https://linux22.com/image/225134/%E5%A6%82%E4%BD%95%E4%B8%80%E6%AD%A5%E5%B0%86%E2%80%9C8%E2%80%9D%E6%9B%BF%E6%8D%A2%E4%B8%BA%E2%80%9C7%E2%80%9D%EF%BC%9F.png)
在Linux终端中,我最初输入了以下命令:
tail -n +80 numbers.txt
在意识到我犯了一个错误并且实际上想使用+70而不是+80之后,我想纠正它。为此,我将光标移动到数字“8”,然后输入“7”,在“8”之前插入“7”,结果是“780”。为了达到“70”,我需要删除“8”。然而,这个过程对我来说似乎很慢。有没有办法直接一步将“8”替换为“7”,就像简单地将“8”替换为“7”一样?
答案1
在 Bash 中,如果您启用了历史扩展(默认情况下启用,尽管有些禁用它),那么输入^old^new
将重新运行应用了替换的最后一个命令(我认为它是缩写!:s/old/new/
或其他内容)。因此,在您的情况下,^8^7
甚至无需使用箭头键浏览整个命令。
键入一个新的 tail -n +70
命令并按Alt.插入上一个命令的最后一个参数可能比编辑上一个命令更快。同样,也tail -n +70 $_
应该这样做。
(对于更复杂的更改:按Ctrlx,Ctrle将打开默认编辑器 ($VISUAL),您可以在其中编辑命令并立即提交。)
答案2
假设您使用的是 bash,覆盖模式默认情况下被禁用并且不绑定到任何快捷方式:
切换覆盖模式。使用显式正数字参数,切换到覆盖模式。使用显式非正数字参数,切换到插入模式。该命令仅影响
emacs
模式;vi
模式确实以不同的方式覆盖。每次调用都以readline()
插入模式开始。在覆盖模式下,字符必然会
self-insert
替换该点的文本,而不是将文本推到右侧。字符必须backward-delete-char
用空格替换点之前的字符。缺省情况下,该命令未绑定。
您可以添加一个键绑定并启用它,然后在完成后再次禁用它,但我认为最好的办法是使用delete-char
相反,默认绑定到Ctrld:
删除该点处的字符。 [...]
光标位于 上后8
,按Ctrld将其删除,然后输入 7。
在vi模式,当已经在8
:<Esc>r7
。或者可以使用<Esc>F8r7
(从行尾开始)将光标移动到第一个8
,然后将其替换为 来完成整个操作7
。