Команда Bash для копирования перед курсором и вставки после?

Аргумент -I работает следующим образом: -I something означает, что буквально встречается something заменяются аргументом команды.Демо:

$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c

Видите? xargs взял каждую из строк a , b и c и подставил их вместо f в эхо эй ф эй ф .

Нет {} .

Параметр -I - POSIX. GNU xargs документирует устаревшую опцию -i , которая при вызове как -iwhatever ведет себя как -I something . При вызове просто -i он ведет себя как -I {} . В этом случае заменяются вхождения {} . {} явно вдохновлен особенностью find : его предикатом -exec .

Синтаксис Bash {a..b} и foo {a, b, c} bar обрабатывается с помощью его «фигурных скобок». {} не имеет особого значения и передается команде как есть. (В противном случае это нарушило бы стандартные, часто встречающиеся вызовы find .)

24
13.10.2016, 01:26
5 ответов

Расширение истории может быть полезно для такого рода вещей (при условии, что история bash включена).

В вашем примере вы можете сделать:

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

Здесь ! # относится к текущей строке, ! #: 1 относится к параметру 1 в текущей строке,
и ! #: 1.bak относится к параметру 1 в текущей строке с прикрепленным к концу '.bak'.

Когда вы напечатали спецификатор истории, вы можете использовать Ctrl + Alt + E , чтобы развернуть его до фактического значения, если вы хотите, например, дважды проверьте или измените имя файла.

Раздел «Расширение истории» на страницах руководства bash содержит дополнительную информацию.

12
27.01.2020, 19:40

Вы также можете фактически вырезать-вставить (kill-yank в терминах emacs / bash) из командной строки, чтобы дублировать части для редактирования.

M-d убивает вперед до границы слова, и вы можете уничтожить текст несколько раз, и все они будут объединены в одну «пасту» для восстановления. Удобный!

Верните все это обратно в командную строку под курсором с помощью C-y . Итак, если у вас есть такая строка (элемент блока █ указывает положение курсора):

$ cp avb.txt█                 (M-b M-b)
$ cp█avb.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

7
27.01.2020, 19:40

Есть несколько уловок (думаю, можно найти дубликат), но для этого я обычно использую

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
43
27.01.2020, 19:40

Похоже на ответ 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█
8
27.01.2020, 19:40

В tcsh или zsh , Alt + Ctrl + _ в Режим emacs (виджет copy-prev-word ) вставляет последнее слово, поэтому

cp very-long-path 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 + _ выполняли как копирование / snarf, так и paste / yank, как в tcsh / zsh .

6
27.01.2020, 19:40

Теги

Похожие вопросы