Usando o grep para encontrar uma string não em outra string

0

Eu tenho um único arquivo de texto. É um exame de múltipla escolha. Nele estão várias centenas de perguntas, cada uma com quatro opções de resposta, uma por linha, que começam com A. B. C. D.

Após cada A. (e B. etc) deve ser um espaço único, então imediatamente o primeiro caractere do texto da questão. Assim:

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

Eu quero encontrar todas as linhas que começam com A. que têm algo diferente de um único espaço (um caracter diferente OU, digamos, dois ou mais espaços) antes do primeiro caractere da opção de resposta. Então faça o mesmo para B. C. e D.

/ editar

Eu quero diferenciar entre as linhas "OK" e "não OK".

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

por exemplo

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

A. 123 OK.
A. ABC OK.

Eu quero localizar todas as linhas "não OK".

/ final da edição

    
por mike65535 14.07.2018 / 14:24

3 respostas

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

Isso extrairia todas as linhas do seu arquivo que começam com A. , B. , C. ou D. seguido por um caractere não espaço ou dois espaços.

A expressão é uma expressão regular estendida (devido à alternação com | ) e é por isso que usamos -E com grep .

    
por 14.07.2018 / 14:38
0

Se o grep suportar expressões regulares compatíveis com Perl (PCRE), você poderá fazer uma lookahead negativa para um único espaço seguido por qualquer caractere não espacial:

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

ou, se você quiser combinar a pesquisa para todos os quatro A, B, C, D

grep -P '^[A-D]\.(?! \S)' file
    
por 14.07.2018 / 14:37
0
 sed -e '/^[A-D][.][ ][^ ]/d' input-file.txt

Isto irá deletar todas as linhas Ok, e o que sobrou seriam as linhas não ok e quais seriam as sed para stdout para impressão.

Supondo que você não considere um caractere TAB como espaço.

    
por 14.07.2018 / 17:29