Eu tenho um arquivo de texto como este (usando o gVim no Windows)
foo bar baz quux
corge grault garply
waldo fred plugh
[...150 more lines...]
xyzzy thud
Eu quero adicionar um número para cada linha do arquivo. Não usando :set number
, mas para adicionar o número como texto que precede cada linha, conforme a seguir, para que o número faça parte do arquivo.
1. foo bar baz quux
2. corge grault garply
3. waldo fred plugh
[...~150 more lines...]
155. xyzzy thud
macro
text-generation
enumerate
roblogic
fonte
fonte
awk
é provavelmente a ferramenta para este trabalho. Mas estou no Windows (suspiro).cat
ornl
, que podem criar linhas numéricas, mas geralmente não estão disponíveis no Windows (como OP indica em seus comentáriosawk
). As duas principais soluções são o Vim puro. Por fim, todas as linhas versus um para são apenas uma questão de seleção de intervalo. Claramente, não é um grande problema.Respostas:
Na moda pura do Vim:
Explicação:
Veja
:help \=
e:help line()
.Usar uma expressão na peça de substituição é muito poderoso e o FWIW é um bom ponto de entrada para o vimscript.
fonte
:help sub-replace-expression
Uma coisa legal das macros do Vim é que elas podem ser recursivas (podem se invocar):
qqq
ggI1.
(não esqueça o espaço!)0qq
yW
+P
0<c-a>
0
@q
.q
@@
A macro continuará se invocando até atingir o final do arquivo.
Você pode usar o truque de macro recursivo para muitos outros problemas semelhantes, por isso é bom estar ciente.
Se você não quiser usar uma macro recursiva por algum motivo, poderá omitir as etapas 1 e 8 e usar uma contagem para executar a macro várias vezes, por exemplo
100@q
, executará a macroq
100 vezes.fonte
Eu gosto de usar o comando global vim para realizar tarefas como esta. Isso se aplica à adição da iteração ao início de uma linha ou à modificação de um símbolo no texto. Parece mais complicado do que as outras soluções, mas é um padrão bastante flexível para usar quando você o tem à mão e é fácil de modificar sem muita reflexão.
Primeiro, escolha seu intervalo (quais linhas você deseja aplicar). Eu costumo usar marcas (por exemplo,
ma
na primeira linha emb
na segunda, mas você também pode usar números de linha ou seleção visual) e, em seguida, insiro uma modificação do seguinte comando (atualmente ajustado para o seu caso de uso)Desconstrução
Isso configura a variável
i
com um valor inicial. Normalmente, as listas começam com 1, então estou configurando i para 1.A barra inicia um novo comando
Isso define o intervalo do próximo comando. Vou de marca
a
em marcab
, que seria definida na primeira e na última linha da sua lista.Este é o comando global. Ele procura no arquivo (ou intervalo) uma expressão regular especificada e executa o restante da linha de comando em cada uma das linhas correspondentes. Estou correspondendo todas as linhas pesquisando "início de linha". Se você tivesse um texto como
e só deseja colocar esses rótulos na frente
Item
e ignorar as outras linhas, façag/Item/
oug/^Item/
substitua (assumindo o texto literal do item)Isso executa a expressão regular para substituir o início da linha pelo valor de
i
concatenado por a.
. Geralmente, você pode fazer isso com qualquer coisa (substitua a etiquetaItem
pelo número, por exemplo).Mesmo que a barra inicie um novo comando, ela configura um segundo comando para executar no comando global, em vez de após a conclusão da global. O resultado é que incrementamos
i
antes que a próxima linha seja processada por g. Aqui está outro lugar de flexibilidade. A modificação de i pode ser qualquer coisa (incremento de 2, chame uma função que gera o próximo elemento da sequência de Fibonacci, qualquer que seja).fonte
Adicionar números a todas as linhas
É possível usar
:%!nl -ba
ou:%!cat -n
comandos que adicionam números de linha a todas as linhas.No Windows, você deve ter o Cygwin / MSYS / SUA instalado.
Adicionar números às linhas selecionadas
Para adicionar números apenas às linhas selecionadas, selecione-os no modo visual ( ve cursores) e, quando terminar, execute o comando:
:%!nl
(ignorar linhas em branco) ou:%!cat -n
(linhas em branco incluídas).Formatação
Para remover espaços extras, selecione-os no bloco visual ( Ctrl+ v) e remova-os ( x).
Para adicionar alguns caracteres (
.
,:
,)
) após os números, selecione-os no bloco visual ( Ctrl+ v), em seguida, acrescentar o personagem ( A, digitar o caractere, em seguida, acabar com Esc).fonte
Uma modificação da resposta de romainl :
Isso não apenas adicionará números de linha, mas também substituirá os números de linha existentes, caso eles já estejam lá. Se você inseriu uma linha no meio do caminho, ela renumerará tudo conforme o esperado.
Isso funciona substituindo qualquer número seguido por a. e um espaço no início da linha com um novo número. Obviamente, isso será interrompido se você tiver uma linha que já comece com esse padrão, portanto, use com o pensamento.
A parte adicionada:
^
- Início da linha\(
- Iniciar novo subgrupo\d\+
- Combine um dígito uma vez ou mais\.
- Combine um ponto (
.
) e um espaço.
\)
- Subgrupo final\?
- Torne o grupo opcional, para que funcione como antes, se ainda não houver um número nesta linha.Dica de bônus:
para remover os números de linha, você pode usar o mesmo padrão com a parte de repetição vazia:
fonte
Isso numera as duas primeiras linhas e você pode pressionar
@q
para numerar as linhas subseqüentes (ou digitar ex.18@q
Se desejar numerar 20 linhas no total).Explicação:
A vantagem disso é que ele não requer nenhum comando externo, o que é útil se você estiver trabalhando com o Vim no Windows, por exemplo.
fonte
1. <esc>h
você está na segunda coluna, não na primeira coluna. Eu substituiriah
por0
, depois do qual acho que sua solução deve ser muito boa.^
aguarde um segundo caractere para permitir combinações de digitação como^a -> â
. Ainda concordo que seja a melhor solução, mas acho que isso deve ser mencionado também.Eu acho que a resposta escolhida é a melhor, mas no espírito da variedade, vou oferecer uma alternativa usando um programa externo:
Isso filtrará todo o buffer (conforme indicado por
%
) através do programa externocat
, onde o-n
sinalizador precede cada linha de entrada com um número de linha.Obviamente, isso requer que você tenha
cat
instalado, o que é verdade para (provavelmente) todos os sistemas do tipo Unix.Confira
:help :range!
mais detalhes sobre como filtrar através de programas externos.fonte
msysgit
e adicionou isso ao seu PATH (o IIRC é uma opção de instalação), esta solução também deve funcionar no Windows.cat -n
não é POSIX, masnl
é, portanto, pode ser uma opção melhor.Uma solução um pouco imprudente pode ser a seguinte (tudo que é escrito entre <e> deve ser inserido depois de pressionar Ctrl+ v):
Desconstrução
executa o comando no modo normal em cada linha especificada pelo intervalo, nesse caso, todas as linhas
redireciona todas as saídas feitas pelos comandos ex para o buffer sem nome.
é um comando ex que exibe o número da linha atual (infelizmente com uma nova linha anterior)
pára de redirecionar para o buffer sem nome
insere o conteúdo do buffer sem nome com a. e uma guia para a frente de cada linha e sai do modo de inserção.
vai uma linha e remove a nova linha que é o resultado do comando:. =.
fonte