2010-07-26 10 views
47

chcę to zrobić:Vim regex wsteczne

%s/shop_(*)/shop_\1 wp_\1/ 

Dlaczego nie shop_(*) dopasowania czegokolwiek?

+0

Jestem trochę bliżej: '% s/shop _/& wp_ \ 1' – nnyby

+1

Jeśli nie rozumiem poprawnie, spróbuj dodać przykłady. – Stephen

+5

To pytanie byłoby bardziej przydatne dla przyszłych użytkowników SO, gdyby dodano przykład tego, co jest próbowane z wyrażeniem regularnym. – LondonRob

Odpowiedz

7

Jeśli dobrze rozumiem, chcesz %s/shop_\(.*\)/shop_\1 wp_\1/

Ucieczka nawias przechwytywania i użyć .* dopasować dowolną liczbę jakiegokolwiek charakteru.

(Twoje wyszukiwanie jest poszukiwanie „shop_” następnie dowolną liczbę otwarciu nawiasów następnie nawias zamykający)

56

Istnieje kilka kwestii tutaj.

  1. nawiasy w vim regexen nie są do przechwytywania - trzeba użyć \(\) do przechwytywania.

  2. nie znaczy co myślisz. Oznacza to "0 lub więcej poprzednich", więc twoje wyrażenie oznacza "ciąg zawierający shop_, po którym następuje 0+ (, a następnie literalny ).
    Szukasz ., który w wyrażeniu regularnym oznacza" dowolny znak ". razem z gwiazdą jak .* to znaczy „0 lub więcej charakteru” prawdopodobnie chcesz co najmniej jeden znak, więc używaj .\+ (+ oznacza „1 lub więcej od poprzedniego”)

używać.: %s/shop_\(.\+\)/shop_\1 wp_\1/.

Opcjonalnie zakończ z g po ostatnim ukośniku zastąpić wszystkie wystąpienia w jednym wierszu, a nie tylko pierwszy.

+0

Po prostu gnój: istniejący regex nie szukał literału '*)', tylko literał ')'. – Stephen

+0

@ Stephen: Woops, masz rację. Mistoping tam. – Daenyth