ソースコードで書かれたメールを理解する方法を見つけようとしています。探している情報を取得するために使用できる方法を見つけましたgrep
が、構文に慣れていないため、grep
今後どのように使用するかを研究しています。sed
私がgrepを使う理由は次のとおりです。
grep [0-9a-zA-Z]@[0-9a-zA-Z] ./ -r | \
grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' | \
sort | uniq -c | sort -n
この(2番目の)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
grep -E
FWIW私はこのEREを使用します(したがって、、、sed -E
などawk
で動作しますperl
)。
[0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}
正規表現ベースhttp://www.regular-expressions.info/email.html。ツールでサポートされている場合は、単語の境界を追加してください。サンプル入力/出力なしで電子メールアドレスをバインドする他の方法は提案できません。私は特に文字クラスを使用しないので、英語のアルファベットだけを取得します。これは私のアプリケーションに最も適しているからです。