我有一个文本文件。这是多项选择题考试。其中有数百个问题,每个问题有四个答案选择,每行一个,以 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.
该表达式是一个扩展的正则表达式(由于与 的交替|
),这就是我们使用-E
with 的原因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 字符视为空格。