「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

この(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'

おすすめ記事