일곱 번째 필드의 이메일 주소만 제거하려고 합니다. 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
만 포함하는 다른 규칙을 추가 할 수 있습니다 .1
1
print
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번째 발생과 일치합니다.