Mam taki plik tekstowy (używając gVim w systemie Windows)
foo bar baz quux
corge grault garply
waldo fred plugh
[...150 more lines...]
xyzzy thud
Chcę dodać numer do każdej linii w pliku. Nie używa :set number
, ale dodaje numer jako tekst przed każdym wierszem, jak pokazano poniżej, więc numer jest częścią pliku.
1. foo bar baz quux
2. corge grault garply
3. waldo fred plugh
[...~150 more lines...]
155. xyzzy thud
macro
text-generation
enumerate
roblogic
źródło
źródło
awk
jest prawdopodobnie narzędziem do tego zadania. Ale jestem na Windowsie (westchnienie).cat
lubnl
, które mogą wykonywać linie liczbowe, ale nie są ogólnie dostępne w systemie Windows (jak wskazuje OP z ich komentarzaawk
). Dwa pierwsze rozwiązania to czysty Vim. Wreszcie, wszystkie linie w stosunku do jednego para to tylko kwestia wyboru zakresu. Oczywiście nie jest to duży problem.Odpowiedzi:
W czystym stylu Vima:
Wyjaśnienie:
Zobacz
:help \=
i:help line()
.Użycie wyrażenia w części zamiennej jest bardzo potężne, a FWIW całkiem niezły punkt wejścia do vimscript.
źródło
:help sub-replace-expression
Jedną fajną rzeczą w makrach Vima jest to, że mogą się powtarzać (mogą się wywoływać):
qqq
ggI1.
(nie zapomnij o spacji!)0qq
yW
+P
0<c-a>
0
@q
.q
@@
Makro będzie dalej wywoływać się, dopóki nie osiągnie końca pliku.
Możesz użyć sztuczki makro rekurencyjnej do wielu innych podobnych problemów, więc warto o tym pamiętać.
Jeśli z jakiegoś powodu nie chcesz używać makra rekurencyjnego, możesz pominąć kroki 1 i 8 i użyć licznika, aby uruchomić makro wiele razy, np.
100@q
Uruchomi makroq
100 razy.źródło
Lubię używać globalnego polecenia vim do wykonywania takich zadań. Dotyczy to dodawania iteracji na początku linii lub modyfikowania symbolu w tekście. Wygląda na bardziej skomplikowane niż inne rozwiązania, ale jest dość elastycznym wzorem do użycia, gdy masz go pod ręką, i można go łatwo modyfikować bez zastanowienia.
Najpierw wybierz zakres (które linie chcesz zastosować). Zwykle używam znaków (np.
ma
W pierwszym wierszu imb
w drugim, ale możesz także użyć numerów linii lub wyboru wizualnego), a następnie wprowadź modyfikację następującego polecenia (obecnie dostosowanego do twojego przypadku użycia)Dekonstrukcja
To ustawia zmienną
i
z wartością początkową. Zwykle listy zaczynają się od 1, więc ustawiam i na 1.Pasek rozpoczyna nowe polecenie
Ustawia zakres następnego polecenia. Przechodzę od znaku
a
do znakub
, który zostałby ustawiony w pierwszym wierszu i ostatnim wierszu listy.To jest polecenie globalne. Przeszukuje plik (lub zakres) pod kątem określonego wyrażenia regularnego i wykona resztę wiersza poleceń na każdym z pasujących wierszy. Dopasowuję każdą linię, szukając „początku linii”. Jeśli masz tekst podobny do
i chcę tylko umieścić te etykiety przed
Item
i zignorować inne wiersze, zróbg/Item/
lubg/^Item/
zamiast (zakładając dosłowny tekst pozycji)Spowoduje to wykonanie wyrażenia regularnego w celu zastąpienia początku wiersza wartością
i
konkatenowaną przez a.
. Zasadniczo możesz to zrobić w dowolny sposób (na przykład zastąp etykietęItem
numerem).Mimo że pasek rozpoczyna nowe polecenie, ustawia drugie polecenie do uruchomienia w ramach polecenia globalnego, zamiast po zakończeniu globalnego. W rezultacie zwiększamy,
i
zanim kolejny wiersz zostanie przetworzony przez g. Oto inne miejsce elastyczności. Modyfikacja i może być dowolna (inkrementacja o 2, wywołanie funkcji, która generuje następny element sekwencji Fibonacciego, cokolwiek).źródło
Dodaj liczby do wszystkich linii
Można użyć poleceń
:%!nl -ba
lub:%!cat -n
poleceń, które dodadzą numery linii do wszystkich linii.W systemie Windows musisz mieć zainstalowany Cygwin / MSYS / SUA.
Dodaj liczby do wybranych linii
Aby dodać liczby tylko do wybranych linii, wybierz je w trybie wizualnym ( vi kursorach), a następnie po zakończeniu - wykonaj polecenie:
:%!nl
(zignoruj puste linie) lub:%!cat -n
(w tym puste linie).Formatowanie
Aby usunąć dodatkowe spacje, zaznacz je w bloku wizualnym ( Ctrl+ v) i usuń je ( x).
Aby dodać kilka znaków (
.
,:
,)
) po numerach, wybierz je w polu widzenia ( Ctrl+ v), a następnie dołączyć znak ( Awpisz znak, a następnie zakończyć Esc).źródło
Modyfikacja odpowiedzi Romainla :
To nie tylko doda numery linii, ale także zastąpi numery linii wychodzących, które już tam są. Jeśli wstawisz linię w połowie drogi, wszystko zmieni numerację zgodnie z oczekiwaniami.
Działa to poprzez zastąpienie dowolnej liczby, po której następuje. i spację na początku linii z nowym numerem. To oczywiście pęknie, jeśli masz linię, która już zaczyna się od tego wzoru, więc używaj z przemyśleniem.
Dodana część:
^
- Początek linii\(
- Uruchom nową podgrupę\d\+
- Dopasuj cyfrę raz lub więcej razy\.
- Dopasuj kropkę (
.
) i spację.
\)
- Koniec podgrupy\?
- Ustaw grupę jako opcjonalną, aby działała jak poprzednio, jeśli w tej linii nie ma jeszcze numeru.Dodatkowa wskazówka:
Aby usunąć numery linii, możesz użyć tego samego wzoru z pustą częścią repalce:
źródło
To numeruje pierwsze dwa wiersze i możesz nacisnąć,
@q
aby ponumerować kolejne wiersze (lub wpisz np.,18@q
Jeśli chcesz numerować łącznie 20 wierszy).Wyjaśnienie:
Zaletą tego jest to, że nie wymaga żadnych zewnętrznych poleceń, co jest przydatne, jeśli na przykład pracujesz z Vimem w systemie Windows.
źródło
1. <esc>h
znajdujesz się w drugiej kolumnie, a nie w pierwszej kolumnie. Chciałbym wymienićh
się0
, po czym myślę, że rozwiązanie powinno być bardzo dobre.^
czeka na drugi znak, aby umożliwić takie kombinacje pisania^a -> â
. Nadal zgadzam się, że jest to najlepsze rozwiązanie, ale myślę, że należy o tym wspomnieć.Myślę, że wybrana odpowiedź jest najlepsza, ale w różnorodności zaoferuję alternatywę za pomocą zewnętrznego programu:
Spowoduje to przefiltrowanie całego bufora (zgodnie z oznaczeniem
%
) przez zewnętrzny program,cat
w którym-n
flaga poprzedza każdą linię wejścia numerem linii.To oczywiście wymaga
cat
zainstalowania, co dotyczy (prawdopodobnie) wszystkich systemów uniksowych.Sprawdź
:help :range!
więcej szczegółów na temat filtrowania przez programy zewnętrzne.źródło
msysgit
i dodałeś to do ŚCIEŻKI (IIRC to opcja instalacji), to rozwiązanie powinno również działać w systemie Windows.cat -n
nie jest POSIX, alenl
jest, więc może być lepszą opcją.Trochę zhackowane rozwiązanie może wyglądać następująco (wszystko, co napisano między <a>, należy wstawić po naciśnięciu Ctrl+ v):
Dekonstrukcja
uruchamia polecenie trybu normalnego w każdej linii określonej przez zakres, w tym przypadku w każdej linii
przekierowuje każde wyjście wykonane przez polecenia ex do nienazwanego bufora.
to polecenie ex, które wyświetla bieżący numer linii (niestety z poprzednią nową linią)
przestaje przekierowywać do nienazwanego bufora
wstawia zawartość nienazwanego bufora za pomocą. oraz tabulator na początku każdej linii i wychodzi z trybu wstawiania.
idzie jeden wiersz w górę i usuwa nowy wiersz, który jest wynikiem polecenia:. =.
źródło