파일에서 특정 필드의 이메일 주소만 제거하는 방법은 무엇입니까?

파일에서 특정 필드의 이메일 주소만 제거하는 방법은 무엇입니까?

일곱 번째 필드의 이메일 주소만 제거하려고 합니다. sed를 통해 이 작업을 시도했지만 삭제하려는 열을 선택/선택할 수 없습니다. 일곱 번째 필드에 있는 모든 이메일 주소를 제거하고 싶습니다.

입력 파일:

980||||||[email protected]||77880|GB||0CA005D||
7980||||||[email protected]||5656|PO||69B88008BE||
100||||||[email protected]||31000|USA||0C5D||
101||||||||3100df0|CAN||0C5D||
570||||||[email protected]||5521123|RSA||B70F2||
080570||||||[email protected]||AV6777|OI||A005D||
1870||||||USA||5521123|RSA||B70F2||
 70||||||RABBIT||AV6777|OI||A005D||

산출:

980||||||||77880|GB||0CA005D||
7980||||||||5656|PO||69B88008BE||
100||||||||31000|USA||0C5D||
101||||||||3100df0|CAN||0C5D||
570||||||||5521123|RSA||B70F2||
080570||||||||AV6777|OI||A005D||
1870||||||USA||5521123|RSA||B70F2||
70||||||RABBIT||AV6777|OI||A005D||

이것이 내가 달성하려고 하는 것이지만 달성할 수 없는 것입니다.

sed 's/,[a-z][0-9]\@[a-z][0-9]\.[a-z]//' file

답변1

(질문에 더 많은 요구 사항을 추가한 후 스크립트를 편집했습니다.)

awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } { print }' file

설명하다:

-F '|' -v OFS='|'입력 및 출력 필드 구분 기호 설정
$7 ~ /@/조건부: 7열에 포함 @
{ $7 = "" }작업: 7열을 빈 문자열로 설정
{ print }무조건 작업: 행 인쇄

스크립트는 7열에 포함된 모든 항목이 @이메일 주소이고 해당 이메일 주소에 속하지 않는 다른 데이터는 없다고 가정합니다.

Valentin Bajrami의 의견에서 언급했듯이 해당 문을 생략하고 암시적 기본 동작( )이 있는 "항상 true" 조건인 print만 포함하는 다른 규칙을 추가 할 수 있습니다 .11print

awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } 1' file

참고: 질문의 (편집된) 예제 출력과 달리 스크립트는 예제 입력의 마지막 줄에서 선행 공백을 제거하지 않습니다.

답변2

이 시도.

awk -F\| -vOFS=\| '$7="";1'

답변3

단순화된 이메일 정규식을 사용하여 |6번째 항목과 선택적 이메일 주소를 다음으로 바꿉니다 |(7번째 필드의 이메일 주소가 아닌 주소는 변경하지 않고 그대로 유지).

sed 's/|\([^|@]\+@[^|@]\+\.[a-zA-Z]\{2,\}\)\?/|/6' file
  • s/바꾸다
  • |리터럴과 일치|
  • \(그룹 시작
  • [^|@]\+하나 이상의 비 문자 |및 비 @문자와 일치합니다(앞의 모든 문자 @)
  • @리터럴과 일치@
  • [^|@]\+위의 두 줄과 동일
  • \.점을 맞추다
  • [a-zA-Z]\{2,\}2개 이상의 문자 일치
  • \)터미널 그룹
  • \?0 또는 그룹 일치
  • /|/사용. . . 교체|
  • 6패턴의 6번째 발생과 일치합니다.

관련 정보