Grupy przechwytywania Vim Regex [bau -> byau: ceu -> cyeu]

136

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?

chrześcijanin
źródło
4
To trochę nie na temat, więc umieściłem to tutaj jako komentarz, ale… zrobię to :%norm ay<CR>.
romainl
2
W twoim przypadku (jeśli jest dokładnie tak jak opisano), możesz: przejść do drugiej kolumny za pomocą l, przejść do trybu Visual Block Ctrl+v, zaznaczyć całą kolumnę, Shift+ga lnastępnie przejść do trybu wstawiania za pomocą Shift+ii wprowadzić „y”. 7 naciśnięć klawiszy, w tym zakończenie, Escaby wyjść z trybu wstawiania. Nie publikuję jako odpowiedzi, ponieważ tak naprawdę nie chodzi o grupy przechwytywania (czego szukałem, kiedy to znalazłem). :-)
LAFK mówi Przywróć Monikę

Odpowiedzi:

230

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ć:

Johnsyweb
źródło
44

Jeśli nie chcesz uciec grupom przechwytującym za pomocą odwrotnych ukośników (właśnie to przegapiłeś), dołącz \vna początku, aby zmienić silnik wyrażeń regularnych Vima w bardzo magiczny tryb:

:%s/\v(\w)(\w\w)/\1y\2/g
Ingo Karkat
źródło
Ingo, przepraszam za umieszczenie pytania w złym miejscu: To działa znaleźć w :exmode; czy jest sposób, aby to zrobić w oknie dialogowym znajdowania / zamieniania gvim?
JJoao
3
@JJoao: Nie, pole „znajdź / zamień” służy tylko do dosłownego wyszukiwania i zamiany. W każdym razie nie powinieneś tego używać; to tylko kółka szkoleniowe dla użytkowników Notatnika.
Ingo Karkat
Ingo, dziękuję (to nie dla mnie: jestem zadowolony z exmode, ale dla lingwistów współpracowników w projekcie słownikowym): prawie działa - z \v...regexp praca znajdź; w zastępczym ciągu, &działa, ale \ są chronione ( \1\rsą zgubione)
JJoao
@JJoao: Tak, tego też się dowiedziałem grając z nim. Nadal jestem sceptyczny, czy używanie Vima bez trybu Ex jest dobrym pomysłem, ale możesz łatwo zbudować własne okno dialogowe wyszukiwania i zamiany (wewnętrznie zasilane :s) przez inputdialog()i trochę Vimscript.
Ingo Karkat
Ingo: Jeszcze raz dziękuję; Zgadzam się z twoją sceptyczną opinią. Inputdialg +: s + vimscript jest prawdopodobnie sposobem budowania funkcji find replace gvima. Dla mnie \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.
JJoao
39

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.
  • &ydodaje ypo wzorze.
Juan
źródło
13

Musisz także uciec od parantezy grupowania:

:%s/\(\w\)\(\w\w\)/\1y\2/g

To załatwia sprawę.

Henkersmann
źródło