문자/숫자/대시 이외의 내용을 포함하는 줄을 찾는 Grep 정규식

문자/숫자/대시 이외의 내용을 포함하는 줄을 찾는 Grep 정규식

문자나 숫자, 대시 이외의 내용이 포함된 file.txt 줄로 이동하는 정규식이 필요합니다.

file.txt는 다음과 같습니다

   zigzag-p
   100-ig
   inter-op

하지만 약 47,000줄이 있습니다 :) 그래서 file.txt에는 다음과 같은 내용이 있을 수 있습니다.

   a=opera
   a-10-b
   zigzag-p
   100-ig
   inter-op
   out&-yu

숫자 및/또는 문자와 대시를 제외한 모든 줄을 찾으려면 정규식이 필요합니다. 이상적으로는 grep과 함께 사용할 수 있습니다 :)

답변1

grep '[^[:alnum:]-]'

다음 중 하나를 포함하는 행을 반환합니다.특징-로케일에서 영숫자에 속하지도 않고 분류되지도 않습니다.

이는 알파벳 문자에만 국한되지 않고 중국어나 일본어 문자와 같은 알파벳이 아닌 문자의 단어 구성 요소도 포함된다는 점에 유의하세요. 여기에는 결합 발음 구별 기호가 포함되지 않지만 이는 보고서가 결합 악센트 뒤에 U+0301이 오는 선처럼 보일 것임을 Stéphane의미 합니다 é.e

많은 grep구현에서 유효한 문자가 모두 alnum 또는 alnum인 한 로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스가 ​​포함된 행을 보고하지 못합니다 -.

grep -vx '[[:alnum:]-]*'

(빈 줄도 보고하려면 *(0 이상)을 (1 이상)으로 바꾸세요.)+

이러한 경우에는 몇 가지 구현이 더 잘 작동합니다 grep. GNU를 사용하면 입력이 유효한 텍스트가 아닌 것을 감지하더라도 작동하도록 grep해당 옵션을 추가할 수 있습니다 .-a

grep더 일반적이고 이식 가능하게 는 입력이 유효한 텍스트가 아닌 경우 텍스트 유틸리티로는 많은 보장을 얻을 수 없습니다 . 여기에는 유효한 문자를 형성하지 않는 바이트 시퀀스뿐만 아니라 NUL 문자가 포함된 줄이나 너무 긴 줄도 포함됩니다.

POSIX 휴대용 문자 집합(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789)의 문자 52개와 숫자 10개로 제한하려면 로케일을 C/ 로 설정할 수 있습니다 POSIX.

LC_ALL=C grep '[^[:alnum:]-]'

이는 모든 바이트가 C 로케일에서 유효한(정의되지 않을 수도 있음) 문자를 형성하므로 문자 디코딩 문제에도 도움이 됩니다.

관련 정보