bash命令在光标之前复制并粘贴之后?


24

我不确定该如何措辞,但是我经常发现自己输入如下命令:

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

我通常只键入两次路径(使用制表符补全),否则我将复制并粘贴带有光标的路径。是否有一些bashfoo使其更易于键入?


2
我想你是说bash-fu:)

Answers:


43

有很多技巧(我认为有重复的技巧),但是为此我倾向于这样做

cp /etc/prog/dir1/myconfig.yml{,.bak}

它将扩展到您的命令。

这称为支撑扩展。在此处使用的形式中,{}表达式指定了多个用逗号分隔的字符串。这些“扩展”整个/etc/prog/dir1/myconfig.yml{,.bak}表达式,{}依次用每个字符串替换该部分:空字符串,给定/etc/prog/dir1/myconfig.yml,然后.bak给定/etc/prog/dir1/myconfig.yml.bak。结果是

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

这些表达式可以嵌套:

echo a{b,c,d{e,f,g}}

产生

ab ac ade adf adg

有一个使用数字来产生序列的变体:

echo {1..10}

产生

1 2 3 4 5 6 7 8 9 10

您还可以指定步骤:

echo {0..10..5}

产生

0 5 10

该死的多数民众赞成在甜。我以为我不是第一个问这个问题的人,只是一个棘手的问题。
user1028270 16/10/12

逗号在那里做什么?
user1028270 16/10/12

5
请参见手册中的“ 括号扩展 ”:它分隔扩展中使用的值。这两个值是空字符串和.bak
史蒂芬·基特

12

历史记录扩展对于这种事情很有用(假设启用了bash历史记录)。

在您的示例中,您可以执行以下操作:

cp /etc/prog/dir1/myconfig.yml !#:1.bak

在此,!#引用当前行,!#:1引用当前行上的参数1,
并且!#:1.bak引用当前行上的参数1,并在末尾加上'.bak'。

键入历史记录说明符后,如果要例如仔细检查或修改文件名,则可以使用Ctrl+ Alt+ E将其扩展为实际值。

bash手册页中的“历史扩展”部分提供了更多信息。


8

与progo的答案相似,但更简单:C-w将光标左侧的单词切掉(“杀死”),C-y然后再次插入(“ 猛击”)该单词。

$ cp /etc/dir1/myconfig.yml                              (C-w)
$ cp                                                     (C-y)
$ cp /etc/dir1/myconfig.yml                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak

2
同样值得注意的是,您可以连续使用多个单词(例如,如果文件名包含空格),并且Cy会粘贴所有单词,只要您没有移动光标或在两者之间键入其他任何内容即可。单字符删除(例如,退格键/ del / ctrl-d),删除命令的任何混合均可使用。
Random832 '16

6

您实际上还可以从命令行剪切粘贴(在emacs / bash术语中为kill-yank)以复制零件以进行编辑。

M-d杀死单词直到单词边界为止,您可以多次杀死文本,它们都被串联在一起作为单个“粘贴”以进行拖拽。方便!

将所有这些都拉回到光标所在的命令行C-y。因此,如果您有这样一条线(块元素█指示光标位置):

$ cp avb.txt                 (M-b M-b)
$ cpavb.txt                  (M-d) kill the word 'avb'
$ cp █.txt                    (C-y) yank it back
$ cp avb█.txt                 (C-e) to the end of line
$ cp avb.txt                 (C-y) yank it again
$ cp avb.txt avb             finish the line
$ cp avb.txt avb.foo

不管您喜欢哪种方式,熟悉bash在交互式密钥部门中所提供的功能都是有益的。http://web.mit.edu/gnu/doc/html/features_7.html


6

tcsh或中zshAlt+Ctrl+_emacs模式(copy-prev-word小部件)中插入最后一个单词,因此

cp非常长路径Alt+Ctrl+_.back

bash有一个copy-backward-word小部件(默认情况下未绑定到任何键),但是仅将单词复制到环形缓冲区,您还需要按Ctrl-Y(在emacs模式下)拉动它。但是您可以这样做:

bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'

Alt+Ctrl+_tcsh/中一样进行复制/粘贴和粘贴/粘贴zsh

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.