Сperl
$ perl -lane '($i) = grep {$F[$_] eq "fn0"} 0..$#F;
print "$F[$i-1] $F[$i+1]"' ip.txt
tail logfile
tail3 logfile1
tail4 logfile2
-l
удалит символ новой строки из строки ввода и добавит его обратно при печати -a
разбить строку ввода на основе пробелов, @F
массив будет содержать данные ($i) = grep {$F[$_] eq "fn0"} 0..$#F
получить индекс элемента, точное содержимое которогоfn0
print "$F[$i-1] $F[$i+1]"
распечатать необходимые поля
С sed
, который поддерживает ERE
$ sed -E 's/^(.* )?([^ ]+) fn0 ([^ ]+).*/\2 \3/' ip.txt
tail logfile
tail3 logfile1
tail4 logfile2
^(.* )?
необязательные поля в начале строки ([^ ]+) fn0 ([^ ]+)
захватить поля до и послеfn0
(с использованием одного пробела в качестве разделителя полей).*
остаток строки \2 \3
обязательные поля в выводе Вы не можете сделать это только командой zsh bindkey
. Однако, если вы установите мойzsh-edit
плагин , то вы можете просто использовать этот:
bind '^F' 'tmux-sessionizer'
Код, который вы опубликовали, запускается tmux-sessionizer
, если вы нажмете Ctrl+F в пустом приглашении (, по крайней мере, в конфигурации по умолчанию — на практике у вас может быть установлен очень полезный параметр extended_glob
, который требует цитирования ^
, напримерbindkey '^f' 'tmux-sessionizer\n'
). Но обычно она не делает ничего полезного и может сделать что-то плохое, если вы нажмете ее в непустом приглашении -. Лучшим способом запуска внешней команды было бы не использовать для нее ввод оболочки, а вместо этого запустить ее напрямую. Для этого:
function run-tmux-sessionizer { tmux-sessionizer; zle redisplay; }
zle -N run-tmux-sessionizer
bindkey '^f' run-tmux-sessionizer