Mam plik o następującym wzorze:
foo 111
baz
foo 222
baz
foo 333
baz
w który należy przekształcić
foo 111
bar 111
baz
foo 222
bar 222
baz
foo 333
bar 333
baz
Powiel więc wszystkie linie zaczynające się od foo
i zmieniaj tylko foo
w duplikacie, ale resztę linii (która różni się w każdym przypadku) pozostaje nienaruszona. Jak to zrobić?
regular-expression
search
LB7979
źródło
źródło
Odpowiedzi:
Proszę bardzo:
Rozkład:
Ponieważ
g
polecenie zaktualizuje wzorzec wyszukiwania, więc można pominąć wzorzec, który ma zostać zastąpiony w poleceniu zastępczym. (odniesienie::h :g
wyszukajsearch pattern
).Starsza wersja:
Rozkład:
Aby włożyć
^M
prasę Ctrl+vi enter.Uwaga : oryginalnie wymyśliłem „starszą” wersję, zanim dowiedziałem się o
t
poleceniu. Zostawię to, ale nie polecam jej używać. Pierwszy jest bardziej przejrzysty i prosty.źródło
foo
...^M
jak wyjaśniłem?t
, a potem dodałem drugą. Zmienię kolejność, masz rację. A może pierwszym z nich jest POSIX?Robię takie rzeczy przez cały czas i po prostu robię coś podobnego
%s/^foo \(.*\)/foo \1\rbar \1/
(częściowo dlatego, że wykonuję wiele podobnych zadań, których nie można przekształcić w coś sprytnego za pomocą funkcji kopiowania i\(.*\)
jest to teraz część mojej pamięci mięśniowej).Podejrzewam, że nie jest zgodny z POSIX (nie działa na innych klonach vi), ale użycie
^M
( C-VReturn) zamiast\r
wydaje się działać na większości innych klonów vi.źródło