vim comando global somente primeira ocorrência

2

Eu queria saber se é possível usar o comando: g no vim para combinar apenas com a primeira ocorrência de um resultado de pesquisa.

Eu tenho um arquivo com conteúdo como

Match 01
    stuff 01
    stuff 02
    stuff 03
Match 01
    stuff 01
    stuff 02
    stuff 03
Match 02
    stuff 01
    stuff 02
    stuff 03
Match 02
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03

Estou tentando executar o seguinte comando para extrair dados

:g/Match 02/.,$w! /tmp/TESTING.txt

Então, ele está usando o comando global e escreve da linha atual até o final do documento em /tmp/TESTING.txt

A linha atual é sempre a última ocorrência da partida, por isso acabo com

Match 02
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03

Em vez de

Match 02
    stuff 01
    stuff 02
    stuff 03
Match 02
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03

Qual é o que eu quero. Eu queria saber se é possível ter o comando global indo apenas para a primeira ocorrência da partida para resolver isso.

    
por Trent 17.01.2018 / 15:19

3 respostas

3

Parece que o seu problema é que o cursor acabou abaixo da primeira correspondência; minha sugestão seria dizer ao vim para mover o cursor para a linha 1, depois executar o intervalo / gravação:

:1 | /Match 02/,$w! /tmp/TESTING.txt

Eu removi o período, pois parece-me que você deseja gravar um intervalo em um arquivo, e esse intervalo é definido como de a pesquisa em "Correspondência 02" até o final $ do arquivo.

Referência:

por 17.01.2018 / 17:16
2

Isso parece funcionar para mim. O problema com seu encantamento parecia ser que a correspondência global estava correspondendo à última correspondência (como era, bem, global):

0;/Match 02/;,$w! file
    
por 17.01.2018 / 17:17
2

Global executa o comando para cada correspondência, então o que realmente é gravado no arquivo é .,$ da primeira correspondência e, em seguida, .,$ da segunda correspondência (etc). Isso pode ser observado anexando ao arquivo de saída em vez de acertar o conteúdo em cada correspondência.

:g/Match 02/.,$w >> TESTING

Uma macro pode ser mais adequada; tipo

qa1G/Match 02
:.,$w! TESTING
q

onde as quebras de linha acima estão onde você precisa mash a chave de retorno. Em seguida, digite :reg a e isso deve ser parecido com

:reg a
--- Registers ---
"a   1G/Match 02^M:.,$w! TESTING^M

e pode ser reproduzido digitando @a

    
por 17.01.2018 / 17:18