grepを使用して他の文字列内にない文字列を検索する

grepを使用して他の文字列内にない文字列を検索する

テキストファイルがあります。多肢選択式試験です。何百もの質問があり、各質問にはABCDで始まり、1行に1つずつ4つの答えの選択肢があります。

各A.(およびB.など)の後にはスペースが続き、その直後には質問テキストの最初の文字が続く必要があります。このように:

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

答えの選択の最初の文字の前に、1つのスペース(別の文字または2つ以上のスペース)以外の文字がある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.後にスペース以外の文字、または2つのスペースが続くすべての行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 文字を空白として扱わないとします。

関連情報