저는 CSV 파일 목록을 매개변수로 받아들이고 첫 번째 파일에 있는 이메일 주소만 출력하는 bash 스크립트를 작성 중입니다. 이를 달성하기 위해 첫 번째 CSV 파일의 각 레코드에 대해 이메일 주소 필드를 찾아 해당 내용을 셸 변수로 읽습니다. 그런 다음 다음 정규식을 사용하여 grep -iE
나머지 모든 파일에서 방금 찾은 이메일 주소를 찾아서 하위 문자열이 아닌지 확인했습니다(예:[이메일 보호됨]같지 않음[이메일 보호됨]), 레코드의 시작이나 끝 부분에 있을 수 있습니다.
"^(.*,)?($EMAIL_ADDRESS|\"$EMAIL_ADDRESS\")(,.*)?\$"
이 접근 방식의 한 가지 문제점은 이메일 주소의 정규 표현식에 특별한 의미를 갖는 점이 포함되어 있다는 것입니다. 내 질문은 다음과 같습니다
- 우아한 방법으로 이 문제를 어떻게 피할 수 있습니까?
- 찾고 있는 값이 이메일 주소가 아니라 일부 자유 텍스트이고 다른 특수 문자도 포함할 수 있는 등 보다 일반적인 경우에 이 문제를 어떻게 피할 수 있습니까?
답변1
Perl 정규 표현식( grep -P ...
) 에서는 \Q...\E
이를 사용하여 메타 문자를 보호 할 수 있습니다.
grep -P "(^|,)\Q$EMAIL\E(,|$)" file.csv
어디:
(^|,)
= 필드의 시작(,|$)
= 필드 끝