如何快速更改Bash命令中的第一个单词?


44

我想用Bash改善我的工作流程,并且我意识到我经常想对不同的可执行文件执行相同的命令。

一些例子:

Git(我想在其中快速更改第二个单词):

git diff     foo/bar.c
git checkout foo/bar.c

Cat / rm(仅需更改第一个单词):

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

我知道可以先按Ctrl+ a然后Del删除第一个单词,但我想知道是否有更快的方法。



老实说,我认为仅使用Ctrl + a并删除是最安全的。绝对不是很慢。
agweber'1

Answers:


56

!$ 扩展到上一个命令的最后一个单词。

因此,您可以执行以下操作:

cat foo/is/a/very/long/path/to/bar.c

rm !$

要么:

git diff foo/bar.c

git checkout !$

您的示例碰巧只重复了最后一个字,因此!$效果很好。如果实际上您有很多要重复的参数,而您只想更改第一个单词,则可以使用!*,它将扩展为上一个命令的所有单词,但第零个单词除外。

请参见bash手册页的“ HISTORY EXPANSION”部分。那里有很多灵活性。


16
正确和正确。我只想发出警告!$您对运行的管线没有完全的视觉控制。这有时会造成危害。特别是如果您出现打印错误。它需要从history什么扩展。因此,如果您在末尾写上最后一个命令,则该命令可能不会在历史记录中结束。使用!$shell 执行新命令时,将不会从键入的最后一个命令行中获取参数,而仅从历史记录的最后一个中获取参数。同样的话在这里
Hastur

1
@Hastur您可以将外壳设置为在选项卡上或在输入时扩展历史记录,以防止发生意外。
slhck

2
@Hastur这就是为什么您需要在zsh(无耻的促销)中按两次介绍性影片的原因
Braiam 2015年

@Hastur-当我对即将发生的事情有疑问时,或者我迟到意识到我必须先执行其他操作才能运行刚刚输入的内容,然后转到该行的开头并添加一个#或一个,echo 这样我就可以看到它并进入历史记录,因此我可以立即将其取回并再次运行,而无需禁用前缀。

28

Ctrl+ a转到行的开头,然后Alt+ d删除第一个单词。


9
删除单词快捷方式实际上是Meta + d,并且Meta通常在Linux计算机上映射到Alt。在不是这种情况的平台上,获取Meta修饰符的另一种方法是使用Escape作为前缀。参见en.wikipedia.org/wiki/Meta_key
GustavoGiráldez15年

2
@GustavoGiráldez如果您想深入了解,则Meta+D仅在emacs启用后才有效(通过set -o emacs或默认情况下)。在劣质编辑器 -mode或emacs已禁用的情况将无法使用。
TC1 2015年

在许多终端中(因为这是终端设备,而不是Bash设备),因此Home键也将转到行的开头。许多笔记本电脑将Fn +左键映射到主键。同样,结束键通常会移至该行的末尾。我尚未使用不支持这些热键的终端仿真器。
凯特2015年

1
@Mike在另一方面,C-a并且M-d速度更快,如果你的手已经在打字位置输入。
jjlin 2015年

@迈克这是一个bash的事情。键入cat并比较按Home(^[[H此处)和按Ctrl + a(^A)时得到的结果。
乔纳斯·谢弗

17

我不确定是否实际上会更快,但是请参阅本文,特别是第.3点:

  1. 使用^ str1 ^ str2 ^替换上一个命令中的字符串

在下面的示例中,首先我们执行ls命令来验证文件。后来我们意识到我们想查看文件的内容。无需再次输入整个文件名,我们可以将前一个命令中的“ ls”替换为“ cat”,如下所示。

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate

15

Alt+.

如果只需要重复上述命令之一的最后一部分,则可以使用Alt+ .粘贴从历史记录的最后一行获取的最后一个参数。

如果按下不止一次,将使用之前一行的最后一个参数替换刚粘贴的内容...

例如,如果最后两个命令是:

cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c

在我编写的shell中rm,按Alt+ .,它将出现:

rm foo/is/a/very/long/path/to/SomeWhereElse.c

如果我再按一次Alt+ .它将出现

rm foo/is/a/very/long/path/to/bar.c

等等...


不知道为什么,但是在我的Mac控制台上不起作用。
lulalala 2015年

这里有一些已知可以使用的键盘快捷键bash。顺便说一句,您确定要使用bash作为shell吗?
Hastur 2015年

1
我猜这是Mac的东西。当我输入时,我就会
得知


12

除了@jjlin答案之外,您还可以通过以下提示感兴趣:

  • Ctrl+ w删除左侧的单词
  • Ctrl+ k从光标删除到命令行结尾
  • Ctrl+ u从光标删除到命令行开头
  • Alt+ b将光标向后移动一个单词
  • Alt+ f将光标向前移动一个单词
  • $_ 包含上一个命令行的最后一个参数

有关这些的更多信息,请查阅bash联机帮助页的“ Readline命令名称”部分。

例如:

cat foo/is/a/very/long/path/to/bar.c
rm $_

这些都是不错的技巧,但他们没有回答问题。
slhck

@slhck恕我直言,是因为问题标题与给定的示例不匹配。如果像我一样关注示例,标题应该是“如何在bash命令中快速更改单词?” 。这也是为什么我的答案是“除了@jjlin之外”的原因。但是我想应该澄清这个问题。
maiki 2015年

OP总是要删除(交换)n命令n = 1中的第一个单词,在第一个示例n = 2中,第二个示例中。jjlin的答案显示了如何删除第一个单词(并通过重新应用快捷方式,最多删除n单词)。您的答案列出了一些Bash快捷方式(确实有用),但是它们都不是删除第一个n单词的有效方法。
slhck

嗯,再读一遍,$_如果只有一个参数(即参数的总数n = m - 1在哪里m),则该参数可能会起作用。其余的快捷方式与该问题无关。
slhck

@slhck为了争辩,我已将第一个示例读为“替换第二个单词” :-)
maiki 2015年

8

如果您精通vi,可以使用命令在bash(大多数shell?)中激活vi绑定set -o vi。然后,您可以使用普通的vi键来编辑命令。在第一个示例中,您可以^wcw删除“ diff”,然后将其更改为checkout。

仅仅编辑命令行可能不值得学习vi键绑定,但是如果您已经知道它们,那将是一个整洁的生产力提升器。


我在kornshell上学习,set -o vi我的生活也是如此!我什至在bash提示中也这样做。
bgStack15

bindkey -v对于zsh。Esc 0 c w
user530873

6

有很多方法可以剥皮这只猫!

要替换特定的字符串,^old^new^extra将使用您先前的命令,替换oldnew,然后追加extra。您可能会尽早停止;例如^old将替换old为空字符串并追加空字符串(本质上是删除old并仅执行其他操作)。

1. ^diff^checkout
2. ^cat^rm

特别有用的变体:

for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo

要替换一个特定的词,你可以使用!m:n-p引用的话n通过p命令m(使用负数从当前指令计数回)。您可以省略该-p部分以引用单个单词,也可以省略该:m-p部分以引用整个命令。!!对于!-1!$上一个命令的最后一个单词和上一个命令!*的参数(除word以外的所有参数0)的特殊格式非常方便。

1. !!:0 checkout !!:2-
2. rm !*

我经常使用这两种方式。zsh在这里特别好,因为点击选项卡将扩展神秘的内容,以确保您安装正确。

行编辑也有很多方法可以做到这一点。阅读外壳程序的键绑定。


-2

大多数终端程序支持...

  • <Up-Arrow>根据需要按以重新显示历史记录中的先前命令行之一。
    • <Down-Arrow>根据需要按向前浏览历史记录列表。
  • <Left-Arrow>以移动光标到第二个字的结束需要。
  • <Backspace>根据需要按以清除第二个单词。
  • 输入替换的第二个单词。
    • 根据需要按<Right-Arrow>/ <Left-Arrow>重新定位以进行更多更改。
  • 点击<RETURN>执行命令

如果您想要的命令行不是最近的命令行,请按照<Ctrl-r>问题的描述进行反向i搜索...
在bash中键入命令的一部分后,是否可以使用ctrl -r?
然后根据需要通过箭头键进行编辑。


-3

我的工作(Ubuntu / bash):

1)Arrow up嘿,返回上一个命令
2)Home键,返回到开头
3)根据需要修改命令。

防白痴,对于多行命令特别有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.