以更智能的方式将命令中的字符串更改为另一个字符串

以更智能的方式将命令中的字符串更改为另一个字符串

我知道:

$ command -[options] string string2

可以轻松更改:

$ ^string^string3

获得方法:

$ command -[options] string3 string2  

我还能用它做什么,就像我试图连续做两次一样:

$ ^string3^string && ^string2^string4

或者在命令之后

$ ffmpeg -i file output.mp4 && ^.mp4^.mp3

或者

$ echo blue && ^blue^red
^blue^red: command not found

不起作用

或者

$ echo blue
blue
$ ^blue^red && ^red^purple
red blueblue red^purple

不工作

或者

$ echo blue
$ ^blue^red^red^purple
echo redred^purple
redred^purple    

还是行不通


它是用于 bash 脚本的,我所知道的最短的东西是 ^...^...

我需要一个简短易用的命令来实现这一点,

通过这些例子,你可以明白,

有什么必要呢?有人建议我:

$ echo blue && !#:s/blue/purple/ true
echo blue && echo purple &&  true
blue
purple

结果与我预期的非常吻合,但最终>命令无法完成。更新:我通过在末尾添加 true 来修复此问题。


这个问题之前出现在 StackOverflown 中,并被推荐放在这里!

答案1

首先:所有这些快捷键都是用于交互使用,而不是用于脚本。它们都是 bash 历史系统的一部分,通常在脚本中被禁用(可能应该保持禁用状态)。

第二:该^original^replacement语法被称为“快速替换”,其目的是(顾名思义)通过简单的更改快速重新运行上一个命令。它是不是可扩展到基本用途之外——无法使用此语法进行多项更改。但您可以使用更通用(但冗长)的语法:!!指定最后一个命令(实际上是行;见下文),您可以添加修饰符来:s/original/replacement/进行更改。以下是包含两个替换的示例:

$ echo string1 string2
string1 string2
$ !!:s/1/3/:s/2/4/
echo string3 string4
string3 string4

第三:正如我所说,此历史记录调用和重放功能实际上适用于行(或多行命令),而不是简单命令。以下是一个例子:

$ echo "command one"; echo "command two"
command one
command two
$ echo "command three" && !!:s/command/line/
echo "command three" && echo "line one"; echo "command two"
command three
line one
command two

请注意,!!:s/command/line/并没有调用上一个命令,echo "command three"甚至不是echo "command two",而是整个前一行!此外,即使command该行中出现了两次,替换也只执行了一次。如果要替换所有出现的情况(“全局替换”),请添加修饰符g!!:gs/original/replacement/)。有其他修饰符的数量您可以使用。

最后:这可能会变得很复杂,而且很容易错误预测按下回车键时会发生什么。Kamil Maciorowski 建议以交互方式调用和编辑上一个命令,这样您就可以在按下回车键之前看到该命令,所以我建议使用该方法。

实际上,我通常自己做的是按向上箭头来返回上一个命令,然后使用 bash 的内置行编辑功能进行我想要的更改。

答案2

点击并使您想要更改的命令出现在命令行中。然后按Ctrl+ X, Ctrl+E在您喜欢的编辑器中编辑它。

您可以多快、多轻松地进行所需的更改取决于编辑器和您对它的熟悉程度。要执行,请以编辑器提供的任何名称保存文件并退出编辑器。

VISUAL通过设置或变量选择您的编辑器EDITOR。来自man 1 bash

edit-and-execute-commandC-xC-e
在当前命令行上调用编辑器,并将结果作为 shell 命令执行。Bash 尝试按顺序调用 、 和 作为编辑$VISUAL$EDITORemacs

注意可以配置键绑定。Ctrl+ XCtrl+E是我所说的默认值。

此外你可能会发现这很有用:ctrl-xe 不立即执行命令

相关内容