Matthias Braun Asked: 2019-09-25 05:54:20 +0800 CST2019-09-25 05:54:20 +0800 CST 2019-09-25 05:54:20 +0800 CST 使用宏获取发件人的邮件地址 772 在 Mutt 的索引视图中,我想将发件人的邮件地址复制到系统剪贴板(xclip例如,使用 )。 有没有办法使用宏或任何其他方式获取当前所选邮件的发件人邮件地址? mutt 1 个回答 Voted Best Answer Matthias Braun 2019-10-14T10:15:13+08:002019-10-14T10:15:13+08:00 来自muttrc: # Avoid the "Press any key to continue..." prompt set wait_key=no macro index,pager \cf "|grep -m 1 -oP '(?<=\^From: ).+' | (read after_from; echo \"\$after_from\" | grep -oP '(?<=<)(.+)(?=>)' || echo \"\$after_from\") | xclip -selection c\n" "Yank sender's email to clipboard" 现在Ctrl+f将发件人的电子邮件地址放在 X 系统剪贴板上。替换xclip -selection c为wl-copy使其适用于 Wayland。 我们假设电子邮件地址在这样的一行 From: Firstname Lastname <[email protected]> 或者像这样 From: [email protected] 宏说明: |grep:通过管道将当前电子邮件发送到 grep。 -m 1: grep 匹配第一行后会停止。 -o: grep 只打印匹配的字符串,而不是整行。 P:在 grep 中启用Perl 兼容的正则表达式。我们需要这个用于正则表达式的后视。 '(?<=\^From: ).+': grep 的正则表达式。获取以“From:”开头的行之后的所有字符。该(?<=部分是一个积极的向后看,这意味着该行必须以“From:”开头,但该字符串不是匹配的一部分。后面的字符是匹配的字符串。 此时, grep 打印Firstname Lastname <[email protected]>或[email protected]。 | (read after_from;: 我们将这个字符串传递给程序,该程序read将字符串保存在变量中after_from。括号开始一个subshel l 。 echo \"\$after_from\" | grep -oP '(?<=<)(.+)(?=>)': 假设是的内容after_from,Firstname Lastname <[email protected]>grep 提取电子邮件地址[email protected]。(?=>)是一个正向的前瞻:在匹配的字符串之后,必须有一个>,但是这个右尖括号不是匹配字符串的一部分。 如果 grep 成功(退出代码 0)匹配尖括号内的电子邮件地址,我们将电子邮件地址通过管道传输到xclip并完成。\n相当于 hitEnter使 Mutt 执行宏。 另一方面,如果 grep 不成功,即该部分after_from已经是表单中的电子邮件地址[email protected](没有尖括号),我们只需将该地址发送到剪贴板|| echo \"\$after_from\") | xclip -selection c。右括号标志着我们在我们创建的子 shell 中执行的命令的结束。or 运算符 的||意思是:如果左侧的命令失败(非零退出代码),则执行右侧的命令。 注意:对于 Mutt 的宏,我们必须用反斜杠转义以下字符。如果您想在 Mutt 之外使用该命令,请删除反斜杠: ^ " $
来自
muttrc
:现在Ctrl+f将发件人的电子邮件地址放在 X 系统剪贴板上。替换
xclip -selection c
为wl-copy
使其适用于 Wayland。我们假设电子邮件地址在这样的一行
或者像这样
宏说明:
|grep
:通过管道将当前电子邮件发送到 grep。-m 1
: grep 匹配第一行后会停止。-o
: grep 只打印匹配的字符串,而不是整行。P
:在 grep 中启用Perl 兼容的正则表达式。我们需要这个用于正则表达式的后视。'(?<=\^From: ).+'
: grep 的正则表达式。获取以“From:”开头的行之后的所有字符。该(?<=
部分是一个积极的向后看,这意味着该行必须以“From:”开头,但该字符串不是匹配的一部分。后面的字符是匹配的字符串。Firstname Lastname <[email protected]>
或[email protected]
。| (read after_from;
: 我们将这个字符串传递给程序,该程序read
将字符串保存在变量中after_from
。括号开始一个subshel l 。echo \"\$after_from\" | grep -oP '(?<=<)(.+)(?=>)'
: 假设是的内容after_from
,Firstname Lastname <[email protected]>
grep 提取电子邮件地址[email protected]
。(?=>)
是一个正向的前瞻:在匹配的字符串之后,必须有一个>
,但是这个右尖括号不是匹配字符串的一部分。xclip
并完成。\n
相当于 hitEnter使 Mutt 执行宏。after_from
已经是表单中的电子邮件地址[email protected]
(没有尖括号),我们只需将该地址发送到剪贴板|| echo \"\$after_from\") | xclip -selection c
。右括号标志着我们在我们创建的子 shell 中执行的命令的结束。or 运算符 的||
意思是:如果左侧的命令失败(非零退出代码),则执行右侧的命令。注意:对于 Mutt 的宏,我们必须用反斜杠转义以下字符。如果您想在 Mutt 之外使用该命令,请删除反斜杠:
^
"
$