grep을 사용하여 다른 문자열 내에 없는 문자열 찾기

grep을 사용하여 다른 문자열 내에 없는 문자열 찾기

텍스트 파일이 있습니다. 객관식 시험입니다. 수백 개의 질문이 있으며 각 질문에는 ABCD로 시작하여 한 줄에 하나씩 4개의 답변 선택이 있습니다.

각 A.(및 B. 등) 뒤에는 공백이 오고 바로 뒤에는 질문 텍스트의 첫 번째 문자가 와야 합니다. 이와 같이:

++++++++++++++++++++++++++++++++
This is my question text?
A. Choice 1
B. Choice 2
C. Choice 3
D. Choice 4
++++++++++++++++++++++++++++++++

답 선택의 첫 번째 문자 앞에 단일 공백(다른 문자 또는 두 개 이상의 공백)이 아닌 다른 문자가 있는 A.로 시작하는 모든 줄을 찾고 싶습니다. 그런 다음 BC와 D에도 동일한 작업을 수행합니다.

/편집하다

"OK" 줄과 "Not OK" 줄을 구별하고 싶습니다.

A.<space><any char not a space> is OK.

예를 들어

A.ABC not OK.
A.123 not OK.
A.  ABC not OK

A. 123 OK.
A. ABC OK.

"비정상적인" 행을 모두 찾고 싶습니다.

/편집 끝

답변1

grep -E '^[ABCD]\.([^ ]|  )' file

A.이렇게 하면 파일에서 로 시작 하거나 B.뒤에 공백이 아닌 문자 또는 두 개의 공백이 오는 C.모든 줄이 추출됩니다 .D.

표현식은 확장된 정규 표현식(AND 교대로 인해 |)이므로 -Ewith 를 사용합니다 grep.

답변2

PCRE(Perl Compatible Regular Expressions)를 지원하는 경우 grep다음을 수행할 수 있습니다.부정적인 예측단일 공백 ​​뒤에 공백이 아닌 문자가 오는 경우:

grep -P '^A\.(?! \S)' file

또는 A,B,C,D 4개 모두에 대한 검색을 결합하려는 경우

grep -P '^[A-D]\.(?! \S)' file

답변3

 sed -e '/^[A-D][.][ ][^ ]/d' input-file.txt

이렇게 하면 모든 정상 행이 제거되고 비정상적인 행만 남게 되며 sed는 stdout으로 인쇄합니다.

TAB 문자를 공백으로 처리하지 않는다고 가정합니다.

관련 정보