Substituir um padrão pelo número da linha atual

15

Gostaria de substituir 'x' neste arquivo pelo número da linha atual. Ou seja, mudar

x
x
x

para

1
2
3

Por enquanto, eu uso um liner Perl:

perl -pi -e '$x=$.; s/x/$x/' myfile.txt

Eu acho que o UltraEdit pode fazer isso com uma seleção e substituição vertical. Isso pode ser feito no vim? (Meu exemplo aqui assume que 'x' é tudo o que existe em uma linha. Mas as linhas no meu arquivo real são muito mais complicadas.)

yong321
fonte

Respostas:

23

Sim, o vim pode fazer isso! Faça uma pesquisa global xe substitua-a por \=printf("%d", line('.'). Por exemplo:

:%s/x/\=printf("%d", line('.'))

Você também pode mudar xpara outra pesquisa, se precisar.

Explicação:

Isso substitui todas as ocorrências x(ou o que você procura) pelo registro de avaliação \=. Este registro avalia o código vimscript e retorna uma string. Nesse caso, o código que está sendo avaliado é "Imprima a linha em que estamos como um número decimal"

DJMcMayhem
fonte
9

Como você mencionou a seleção vertical e a substituição, você também pode fazer isso. Use CtrlVpara selecionar o bloqueio de texto que você deseja substituir ce digite 0, para substituir por 0s. Em seguida, selecione os 0s:

insira a descrição da imagem aqui

Então pressione g<c-a>( g+ Ctrla):

insira a descrição da imagem aqui

Se você substituiu uma única coluna, poderá usar gvpara selecionar rapidamente novamente a mesma área.

muru
fonte