我需要从这样的字符串中提取电子邮件地址(我正在制作一个日志解析器): <some text> from=someuser@somedomain.com, <some text>
与egrep
(或grep -Eo
)。所以字符串只需要在 "from="
和 ","
之间拉出,因为日志的其他部分也包含电子邮件地址,如 to=
和 etc
使用 grep -oP
:
s='<some text> from=someuser@somedomain.com, <some text>'
grep -oP '(?<=from=).*?(?=,)' <<< "$s"
someuser@somedomain.com
或者通过使用K
来避免lookbehind
:
grep -oP 'from=K.*?(?=,)' <<< "$s"
someuser@somedomain.com
如果您的grep
不支持-P
(PCRE),请使用此 sed:
sed 's/.*from=(.*),.*/1/' <<< "$s"
someuser@somedomain.com
尝试awk
echo '<text> from=someuser@somedomain.com, <text>' | awk -F[=,] '{print $2}'
在这里,$2
可以根据其位置使用不同的数字。
符号"(", ")"之间的单词示例:
echo "Linux Foundation Certified Engineer (LFCE-JP)" | awk -F[()] '{print $2}'
LFCE-JP
纯粹的bash解决方案,需要两个步骤来分别去除前缀和后缀(但可能运行得更快,因为没有子进程):
#!/bin/bash
orig='from=someuser@somedomain.com, <some text>'
one=${orig#*from=}
two=${one%,*}
printf "Result:n"
printf "$orign"
printf "$onen"
printf "$twon"
输出:
Result:
from=someuser@somedomain.com, <some text>
someuser@somedomain.com, <some text>
someuser@somedomain.com
笔记:
-
${var#*pattern}
从$var
开始到pattern
使用#
条 -
${var%pattern*}
使用%
条,从$var
末端开始,最多pattern
- 类似的可以用
${var/pattern/replace}
完成(replace
留空),但这更棘手,因为不支持完整的正则表达式(即,不能使用^
或 '$'),所以你不能做(例如)/^from=//
,但你可以在第一步中做${var/*from=/}
然后在第二步中,做${var/,*/}
(当然,这取决于你的数据)。 - 另请参阅:http://www.tldp.org/LDP/abs/html/parameter-substitution.html