申し訳ありません。この簡単な質問に対する答えが見つからないようです。我々は、多数の電子メールを含むファイルを持っています。
<To: [email protected]>
<Cc: [email protected]>
<From: [email protected]>
hello person here is random text
待って、20以上のメールを繰り返してください
先生は生徒がawkからEメールを含む行を印刷し、最初に「email =」を追加したいと思います。彼のヒントは、To:From:とCc:をパターン検索として使用することです。彼の理想的な出力は
email = [email protected]
email = [email protected]
email = [email protected]
しかし、その人もかかるでしょう。
email = <To: [email protected]>
email = <Cc: [email protected]>
email = <From: [email protected]>
後者の例を印刷することができます。 (各例ではジャンク文字を削除する方法がわかりません。電子メールごとに一貫していません。)しかし、どのように追加しますかemail =
?
これまで私
awk '/To:|From:|Cc:/ {print}' file
私も他の多くの奇妙なことを試しましたが、彼らは私に構文エラーを与えました。
ありがとうございます!
答え1
以下が必要なことをしているようです。
awk '/To:|From:|Cc:/ {$2=substr($2,1,length($2)-1); print "email = ", $2 }' file
この時点で:
{$2=substr($2,1,length($2)-1)
と同様に、文字列の2番目の要素を取得し、[email protected]>
最後の文字を削除します>
。
"email = "
その後、編集した2番目の要素と一緒に希望の文字列を印刷します$2
。
print "email = ", $2
結果は次のとおりです。
email = [email protected]
email = [email protected]
email = [email protected]
印刷の仕組みをよく理解することをお勧めします。https://www.gnu.org/software/gawk/manual/html_node/Print-Examples.html
答え2
注文する
awk -F ":" '/To|Cc|From/{gsub(">","",$2);print "email ="$2}'
ファイル名
出力
email = [email protected]
email = [email protected]
email = [email protected]
Python
#!/usr/bin/python
import re
k=re.compile(r'To|Cc|From')
q=open('filename','r')
for i in q:
if re.search(k,i):
w=i.split(":")[1].replace(">","")
print "email = {0}".format(w).strip()
出力
email = [email protected]
email = [email protected]
email = [email protected]
答え3
目標が学習であれば、試してみることがawk
できる他の機能があります。これはファイル形式によって多少異なりますが、他の答えも同様です。
awk -F'>|<| ' -v OFS=" = " '/To:|From:|Cc:/{print "E-mail", $(NF-1)}' file
E-mail = [email protected]
E-mail = [email protected]
E-mail = [email protected]
まず、入力フィールド区切り文字を-F
拡張正規表現(ERE)に設定して入力行を分割$0
する<
>
-F'>|<| '
これにより、Eメールアドレスの末尾の余分な文字が削除されますが、スペースのままにし$1
(先行による<
)$2
フィルタフィールドとEメールアドレスを含め、末尾に$3
スペースを含めます(末尾のため)。$4
>
その後、怠惰に出力フィールド区切り文字を設定して、フィールド=
範囲を印刷するたびにデフォルトの動作をフィールド間では=
なく挿入にすることができます。
-v OFS=" = "
フィルタリングは同じ$0
ですが、印刷時に入力文字列を$0
4(およびフィールド数、特殊awk
変数NF
= 4)に分割したため、印刷しようとしています。この場合も$3
同様です。$(NF-1)
'/To:|From:|Cc:/{print "E-mail", $(NF-1)}' file
フィルタフィールドを明示的に抽出したので、必要に応じて明示的な$0
一致を見つけて、他の場所で誤って一致することを防ぐことができます。$2
'$2=="To:"||$2=="From:"||$2=="Cc:"{......