Zamień wzór na bieżący numer linii

16

Chciałbym zastąpić „x” w tym pliku bieżącym numerem wiersza. To znaczy zmiana

x
x
x

do

1
2
3

Na razie używam jedno liniowego Perla:

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

Myślę, że UltraEdit może to zrobić za pomocą pionowego wyboru i zamiany. Czy można to zrobić w vimie? (Mój przykład tutaj zakłada, że ​​„x” to wszystko, co jest w jednej linii. Ale linie w moim prawdziwym pliku są znacznie bardziej skomplikowane.)

yong321
źródło

Odpowiedzi:

24

Tak, vim może to zrobić! Wykonaj globalne wyszukiwanie xi zamień je na \=printf("%d", line('.'). Na przykład:

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

W xrazie potrzeby możesz także przejść do innego wyszukiwania.

Wyjaśnienie:

To zastępuje każde wystąpienie x(lub cokolwiek, czego szukasz) rejestrem oceny \=. Ten rejestr ocenia kod vimscript i zwraca ciąg znaków. W tym przypadku oceniany kod to „Drukuj wiersz, w którym się znajdujemy, jako liczbę dziesiętną”

James
źródło
9

Ponieważ wspomniałeś o pionowym wybieraniu i zastępowaniu, możesz to również zrobić. Użyj, CtrlVaby zrobić, wybierz blokadę tekstu, który chcesz zastąpić, a następnie cwpisz 0, aby zastąpić go zerami. Następnie wybierz te 0:

wprowadź opis zdjęcia tutaj

Następnie naciśnij g<c-a>( g+ Ctrla):

wprowadź opis zdjęcia tutaj

Jeśli zastąpiłeś jedną kolumnę, możesz użyć, gvaby szybko ponownie wybrać ten sam obszar.

muru
źródło