使用 grep 查找不在另一个字符串中的字符串

使用 grep 查找不在另一个字符串中的字符串

我有一个文本文件。这是多项选择题考试。其中有数百个问题,每个问题有四个答案选择,每行一个,以 ABCD 开头

每个 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.

该表达式是一个扩展的正则表达式(由于与 的交替|),这就是我们使用-Ewith 的原因grep

答案2

如果您grep支持 Perl 兼容正则表达式 (PCRE),您可以执行以下操作负前瞻对于单个空格后跟任何非空格字符:

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

或者,如果您想合并所有四个 A、B、C、D 的搜索

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

答案3

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

这将删除所有正常的行,剩下的将是不正常的行,并且 sed 将使用 stdout 进行打印。

假设您不将 TAB 字符视为空格。

相关内容