Как выполнить повторную команду k'th в конвейере?

У меня есть следующий конвейер:

➜ echo ,cats,and,dogs, | sed -e 's/,[^,]*,[^,]*,/,,,/' ,,,dogs, 

Я знаю, что могу запустить команду, как !! «запустить последнюю команду» или !:1 чтобы «получить последние аргументы», но мне интересно, есть ли какая-то команда, которую я могу запустить, которая позволит мне «получить команду k th + args из конвейера»

Итак, в этом примере, если я хотел бы передать какой-либо другой вывод в утилиту sed я мог бы сделать что-то подобное сразу после запуска вышеуказанного конвейера:

 $ echo ,foo,bar,baz, | %:2 

где %:2 – какая-то, возможно, фиктивная команда, которую я не знаю, что «запускает k ю команду в конвейере». Имеет ли эта команда?

2 Solutions collect form web for “Как выполнить повторную команду k'th в конвейере?”

Расширение истории было прекрасным в 80-е годы (когда введено csh ), когда терминалы были очень медленными и ограниченными. Проблема в том, что они не WYSIWYG. Вы не видите, что он расширяет, пока не стало слишком поздно (команда уже запущена) (хотя некоторые оболочки позволяют выполнить расширение до нажатия Enter).

Здесь я бы создал виджет, который вставляет последний элемент конвейера в курсор. С помощью zsh (добавьте его в ~/.zshrc ):

 last-pipe-elements() { emulate -L zsh if [[ $WIDGET = $LASTWIDGET ]]; then # Invoking the widget several times retrieves pipeline # elements for older command lines ((last_pipe_elements_iteration++)) LBUFFER=$last_pipe_elements_saved_LBUFFER else last_pipe_elements_iteration=1 fi last_pipe_elements_saved_LBUFFER=$LBUFFER local -a words words=(${(z)${history[@]}[last_pipe_elements_iteration]}) local nth_pipe=${words[(In:NUMERIC:)\|]} ((nth_pipe)) || return LBUFFER+=${(j: :)words[nth_pipe,-1]} } zle -N last-pipe-elements bindkey '\eP' last-pipe-elements 

Таким образом, вы вводите Alt + Shift + P (здесь предполагается отправить последовательность символов ESC и P , вам может потребоваться адаптировать ее для вашего терминала, который может отправить \xd0 ( $'\MP' ) или даже \xf0 ($ ' \ Mp ') или что-то совершенно другое, проверьте с помощью Ctrl + V ), чтобы вставить последний элемент конвейера (включая | ) последней команды, нажмите его еще раз для команды до этого и используйте Alt + 2 Alt + Shift + P для последних двух элементов трубы.

(z) вызывает синтаксический анализатор оболочки, чтобы разбить командные строки на слова. Мы находим | мы хотим, а затем присоединим слова справа от него с одним пространством. Это означает, что |tr ab станет | tr ab | tr ab , но это не должно влиять на смысл команды, если вы не используете сложные многострочные конструкции ( sed 's/ /x/' не будет изменен на sed 's/ /x/' для пример).

Если вы не хотите определять новый виджет, еще одна вещь, которую вы можете сделать, – это поиск назад (с помощью Ctrl + R, предполагающего режим emacs , хотя вы можете сделать эквивалент в режиме vi ) для предыдущего | , удалите в конец строки Ctrl + K и вернитесь к своей команде ( Вниз ), чтобы вставить ее с помощью Ctrl + Y. Это все равно будет быстрее, чем использование расширения истории и будет по-прежнему визуальным (вы можете лучше визуально выбрать, из которого вы хотите отрезать).

Не знаю, как получить «после трубы», но «после третьего белого пространства» может помочь:

 $ echo ,cats,and,dogs, | sed -e 's/,[^,]*,[^,]*,/,,,/' ,,,dogs, $ echo ,cat,and,mouse, | !:3-$ ,,,mouse, 

Обходной путь для «после трубы»:

 $ echo ,cats,and,dogs, | sed -e 's/,[^,]*,[^,]*,/,,,/' ,,,dogs, $ after_pipe="$(cut -d "|" -f 2- <<<"!!" )" $ echo ,cat,and,mouse, | eval "$after_pipe" $ ,,,mouse, 

( cut должно быть чем-то лучше, если в первой команде есть цитаты «|»).

  • Символы имени действительной функции Shell
  • Сравнение оболочек?
  • Функция Bash не работает в Zsh
  • Разбор JSON на оболочке
  • zsh выбирает вложенный текст
  • Поиск не работает
  • псевдоним? не работает в zsh
  • Как изменить среду оболочки, замеченную приложениями, запущенными на рабочем столе?
  • Могу ли я изменить способ отображения файла?
  • Печать оцениваемых приглашающих заполнителей для отображения
  • Первые символы команды, повторяющиеся на дисплее при завершении
  • Interesting Posts

    Нужно ли писать man-страницы для библиотеки C?

    В каком смысле SATA «разговаривает» с SCSI? Сколько разделяется между SCSI и ATA?

    Как выбрать строку с последней датой и временем

    Являются ли исходные IP-адреса включенными в уникальность уникального порта Linux?

    Измените пространство Partion Drive

    идентификатор пользователя менее 1000 на CentOS 7

    сохранить количество файлов только в определенной папке

    «Нет больше PTY» при запуске экрана в качестве пользователя без root

    KDE4 не заканчивает загрузку

    Аппаратное рендеринг OpenGL в MATLAB

    Использование «&&» недействительно для формы отправки cURL (не выполняйте вторую строку, если первая строка не работает)

    Где dd запускается при копировании раздела?

    Получите время, когда программа nohup R заканчивается

    Как добавить текущую дату перед расширением файла для нескольких файлов в каталоге?

    Как создать фальшивое событие inotify на debian?

    Linux и Unix - лучшая ОС в мире.