如何使用“sed”用匹配子字符串替换整行

如何使用“sed”用匹配子字符串替换整行

我试图找到一种方法来了解用源代码编写的电子邮件。我找到了一种使用 来获取我正在寻找的信息的方法grep,但由于我不太熟悉语法,所以我正在研究将来grep如何使用它。sed我用 grep 做的是:

grep [0-9a-zA-Z]@[0-9a-zA-Z] ./ -r | \
grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' | \
sort | uniq -c | sort -n

该(第二个)grep表达式是在网上找到的,并且有一堆未匹配的内容。

到目前为止我的 sed 表达式是:

grep -h [0-9a-zA-Z]@[0-9a-zA-Z] ./ -r | \
sed -nre 's/.*\([a-zA-Z0-9\.]*@[a-zA-Z0-9\.]*\).*/\1/p' | \
sort | uniq -c | sort -n

它的问题是sed正则表达式是贪婪的。我想过使用/expression/s/.*/\1/,但sed没有找到\1,因为我猜匹配项仅限于.*.

答案1

使用grep

grep -rhoE '[[:alnum:].!#$%&'\''*+/=?^_`{|}~-]+@[[:alnum:].]+' .

也许:

grep -rhoP '(?:[a-z0-9!#$%&'\''*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'\''*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])' .

(基于信息发现于堆栈溢出


关于问题:

  • 不要使用.*尝试否定子表达式中使用的字符类。例如:
sed -nE -e 's/[^[:alnum:]._-]*([[:alnum:]._-]+@[[:alnum:]._-]+)[^[:alnum:]._-]*/\1\
/gp'

答案2

FWIW我使用这个ERE(所以它可以在grep -Esed -Eawkperl等中工作):

[0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}

基于正则表达式http://www.regular-expressions.info/email.html。如果您的工具支持的话,请添加单词边界,如果没有示例输入/输出,我无法建议任何其他内容来绑定电子邮件地址。我特别不使用字符类,因此我只得到英文字母,因为这最适合我的应用程序。

相关内容