죄송합니다. 이 간단한 질문에 대한 답을 찾을 수 없는 것 같습니다. 우리는 많은 수의 이메일을 포함하는 파일을 가지고 있습니다.
<To: [email protected]>
<Cc: [email protected]>
<From: [email protected]>
hello person here is random text
잠깐, 20개 이상의 이메일에 대해 반복하세요
교사는 학생들이 awk에서 이메일이 포함된 행을 인쇄하고 처음에 "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)
와 유사하게 문자열의 두 번째 요소를 가져오고 [email protected]>
마지막 문자를 제거합니다 >
.
"email = "
그런 다음 편집된 두 번째 요소와 함께 원하는 문자열을 인쇄하면 됩니다 $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]
파이썬
#!/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'>|<| '
이렇게 하면 이메일 주소 끝의 추가 문자가 제거되지만 공백으로 남겨두고 $1
(선행으로 인해 <
) $2
필터 필드와 이메일 주소를 포함하고 $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:"{......