Mam listę słów:
bau
ceu
diu
fou
gau
Chcę przekształcić tę listę w:
byau
cyeu
dyiu
fyou
gyau
Bezskutecznie wypróbowałem polecenie:
:%s/(\w)(\w\w)/\1y\2/g
Biorąc pod uwagę, że to nie działa, co muszę zmienić, aby grupy przechwytywania wyrażeń regularnych działały w Vimie?
regex
vim
capturing-group
regex-group
chrześcijanin
źródło
źródło
:%norm ay<CR>
.l
, przejść do trybu Visual BlockCtrl+v
, zaznaczyć całą kolumnę,Shift+g
al
następnie przejść do trybu wstawiania za pomocąShift+i
i wprowadzić „y”. 7 naciśnięć klawiszy, w tym zakończenie,Esc
aby wyjść z trybu wstawiania. Nie publikuję jako odpowiedzi, ponieważ tak naprawdę nie chodzi o grupy przechwytywania (czego szukałem, kiedy to znalazłem). :-)Odpowiedzi:
Jednym ze sposobów rozwiązania tego problemu jest umieszczenie wzorca w nawiasach ze znakiem ucieczki :
:%s/\(\w\)\(\w\w\)/\1y\2/g
Nieco krótsza (i bardziej magiczne -al) jest w użyciu
\v
, co oznacza, że w strukturze po niej wszystkie znaki ASCII z wyjątkiem'0'-'9'
,'a'-'z'
,'A'-'Z'
i'_'
mają szczególne znaczenie::%s/\v(\w)(\w\w)/\1y\2/g
Widzieć:
:help \(
:help \v
źródło
Jeśli nie chcesz uciec grupom przechwytującym za pomocą odwrotnych ukośników (właśnie to przegapiłeś), dołącz
\v
na początku, aby zmienić silnik wyrażeń regularnych Vima w bardzo magiczny tryb::%s/\v(\w)(\w\w)/\1y\2/g
źródło
:exmode
; czy jest sposób, aby to zrobić w oknie dialogowym znajdowania / zamieniania gvim?\v...
regexp praca znajdź; w zastępczym ciągu,&
działa, ale\
są chronione (\1\r
są zgubione):s
) przezinputdialog()
i trochę Vimscript.\1 \r
leczenie to błąd GVIM. Postaram się umieścić to na liście specyficznej dla vima. W międzyczasie spróbuję mojego jednego okna dialogowego Vimscript-input.Możesz również użyć tego wzoru, który jest krótszy:
:%s/^./&y
%s
stosuje wzorzec do całego pliku.^.
dopasowuje pierwszy znak wiersza.&y
dodajey
po wzorze.źródło
Musisz także uciec od parantezy grupowania:
:%s/\(\w\)\(\w\w\)/\1y\2/g
To załatwia sprawę.
źródło