Encontre a correspondência exata do ID que está sempre localizado uma linha abaixo do padrão através do grep [duplicate]

1

Eu gostaria de saber o código de grep para verificar duas correspondências uma após a outra. Por exemplo, eu tenho o seguinte texto de um dos arquivos de pesquisa:

@<TRIPOS>MOLECULE   ← pattern
1532                ← ID
17 17
SMALL
NO_CHARGES

Eu preciso encontrar a correspondência exata do ID que está sempre localizada uma linha abaixo do padrão e, em seguida, recuperar o nome do arquivo do qual o código estava localizado.

Eu usei o seguinte comando:

grep -Pzo '@<TRIPOS>MOLECULE'(?:.*\n)*?\K1532' filename

mas eu tenho arquivos contendo 1532 e 153284. Preciso de código para correspondência exata de ID.

    
por Chetan Munegowda 05.07.2017 / 15:46

1 resposta

1

Seu padrão está procurando 1532 , mas não diz nada sobre o que vem depois:

$ printf '1532\n15321\n1532foo\n' | grep -o '1532'
1532
1532
1532

Dependendo do que você deseja fazer, você pode limitar seu padrão a coincidir apenas com uma nova linha:

grep -Pzo '@<TRIPOS>MOLECULE(?:.*\n)*?\K1532\n' filename

Ou, se houver espaço em branco após o número antes do final da linha:

grep -Pzo '@<TRIPOS>MOLECULE(?:.*\n)*?\K1532\s*\n' filename

Como alternativa, se você puder ter outras coisas na mesma linha, use \b para garantir que o número ocorra antes de um limite de palavras:

grep -Pzo '@<TRIPOS>MOLECULE(?:.*\n)*?\K1532\b' filename
    
por 05.07.2017 / 15:53