Для GNU sed :
sed 's/scaffold\([0-9]*\)_.*/echo "&" >> "\1-scaf.txt"/e' infile
Ответ @John Flood вдохновил меня еще немного подумать об этом, и я придумал следующий обходной путь, который, кажется, работает достаточно хорошо.
Сохраните следующий сценарий как mutt_attach
где-нибудь в $PATH
с литеральным символом Return
вместо^M
(в vim
. Для этого нажмите <c-v><Return>
в режиме вставки ).
#!/usr/bin/env bash
tmp=$(mktemp)
vifm "$HOME" -c "set nohlsearch" --choose-files "$tmp"
# ranger "$HOME" --choosefiles="$tmp"
while IFS="" read -r file; do
tmux send-keys -t email:Email.0 -l "a$file^M";
done < "$tmp"
В .muttrc
определите
macro compose \CA "!mutt_attach\n"
Теперь, если вы откроете mutt
в первой панели окна Email
в сеансе tmux
с именем email
(, созданном, например, с помощью команды tmux new -s email
. Указание сеанса, окна и панели удобно в основном для целей отладки )и нажмите Control+A
в меню создания, vifm
откроется в режиме choose-files
, и выбранный файл будет автоматически прикреплен.
Более того, это позволяет пометить несколько файлов в vifm
с помощьюt
(или визуального режима ), а в ranger
с помощью Space
,и прикрепите их все одновременно!
РЕДАКТИРОВАТЬ:Я заметил, что код не работает для имен файлов, содержащих пробелы, так как кажется невозможным ввести пробел в меню создания вложения в моей версии mutt... Вот (несколько уродливый )обходной путь:
#!/usr/bin/env bash
# File in which to store the list of filenames to attach
tmp=$(mktemp)
vifm "$HOME" -c "set nohlsearch" --choose-files "$tmp"
# ranger "$HOME" --choosefiles="$tmp"
while IFS="" read -r file; do
# Workaround for filenames that contain spaces
if [[ "$file" = *" "* ]]; then
file_no_space=/tmp/$(basename "$file" | sed 's/ /_/g')
ln -s -f "$file" "$file_no_space"
file="$file_no_space"
fi
tmux send-keys -t email:Email.0 -l "a$file^M";
done < "$tmp"
Вы можете открыть ranger в tmux split (вариант, который вы предложили ), выберите файл для прикрепления, скопируйте имя файла с его путем, используя yp
, а затем вернитесь в окно прикрепления mutt, нажмите a
и вставьте путь и имя файла вложения в строку, которая открывается в нижней части окна вложения, и нажмите Enter
.
Что касается проблемы с пробелами в имени файла (в ответ на комментарий @Rastapopolous ), я понял, что у меня есть сильная привычка не использовать их, а повторно -протестировать описанный выше метод вставки путь от рейнджера, я обнаружил, что когда имя файла по какой-то причине содержит пробелы,к имени вложения, вставленному в mutt, добавлено повторение части имени! Можно удалить «придаток» назад, и вложение будет легко отправлено, даже если пробелы не экранированы. Я проверил копию пути из рейнджера в vim, и она вставляется правильно, но не в mutt.
Поскольку я обычно использую tmux, я считаю этот метод относительно простым.
В качестве альтернативы и независимо от tmux у меня также есть следующий скрипт в моем.bashrc:
# email an attachment
function mail_attach ()
{
mutt -F ~/.muttrc -a "$@" -- myemail@gmail.com;
}
export -f mail_attach
Это полезно, когда вы знаете, что прикрепите письмо, прежде чем создавать электронное письмо. Таким образом, внутри рейнджера нужно просто выбрать файл, ввести s
, чтобы открыть командную строку оболочки, и указать выбранный файл с помощью %f
, то есть:
:shell mail_attach %f
Нажатие Enter
откроет редактор mutt для составления электронного письма, к которому уже прикреплен выбранный файл. Однако затем необходимо изменить адрес электронной почты получателя на желаемый. Возможно, есть способ изменить функцию открытия редактора электронной почты с пустым полем «Кому», но я этого недостаточно знаю. Однако я не нахожу это большим делом.
Для нескольких файлов, если они находятся в одной папке, я выбираю их все, а затем нажимаю @
, что является ярлыком рейнджера, чтобы открыть командную строку оболочки, как здесь, где %s
— ссылка на выбранные файлы:
:shell %s
Затем нужно просто вставить mail_attach
перед %s
и нажать Enter, чтобы открыть mutt для составления электронного письма, к которому уже прикреплены все выбранные файлы. Если вы хотите прикрепить файлы из разных папок, я не знаю, как это сделать, кроме как собрать их в одну папку.
Я хотел бы отдать должное тому, кто создал эту функцию, но я больше не знаю, откуда она взялась. Я знаю, что это был не я.