No vim, às vezes tenho ocasião de substituir as primeiras ocorrências de uma partida em uma linha, mas nem todas as que g
gostariam. por exemplo:
a a a a a
para
b b b a a
Eu sei que poderia usar :s/a/b/[enter]:[up][enter]:[up][enter]
, mas isso é tedioso o suficiente em três repetições, tenho linhas com potencialmente mais de 10 substituições.
Eu tentei:
:s/a/b/3g
: vim reclamou de caracteres à direita.:s/a/b/3
: altera a primeira ocorrência nesta e nas duas linhas a seguir.3:s/a/b
: igual ao anterior.:s/a/b/g3
: altera todas as ocorrências nesta e nas próximas duas linhas.:3s/a/b
: altera a primeira ocorrência na linha 3.:/a/,3/a/s/a/b
: altera a primeira ocorrência em cada linha entre a próximaa
e a terceira linha que contéma
o arquivo (solicitando a reversão, se necessário).:/a/,/\([^a]*a\)\{3\}/s/a/b/
: altera a primeira ocorrência em cada linha entre essa e a seguinte com 3a
s (e isso não seria facilmente extensível a uma pesquisa com vários caracteres).
E vários outros padrões de endereçamento, nenhum dos quais funcionou. Devo dizer que aprendi :s
bastante sobre o comando tentando encontrar uma resposta para esse problema, mas ainda não o resolvi.
Alguém sabe como fazer isto?
(pontos de bônus por faixa específica, por exemplo, segunda a quarta ocorrências)
n
e .
, embora não tenha pensado em usá-los aqui. Certamente uma melhoria, obrigado.
s/a/=something/
deve fazer o truque ( :help sub-replace-=
). Não sou fluente o suficiente no Vim para escrever something
logo de cara .
:[up][enter]
pode ser substituído por &
, o que ainda não é o ideal, mas pelo menos é menos doloroso.