“X” ile başlayan yinelenen satırlar, yinelenen “x” yerine “y”?


9

Aşağıdaki desen ile bir dosya var:

foo 111
baz
foo 222
baz
foo 333
baz

dönüştürülmesi gereken

foo 111
bar 111
baz
foo 222
bar 222
baz
foo 333
bar 333
baz

Bu nedenle, ile başlayan tüm satırları çoğaltın foove yalnızca fooçoğaltın içinde değiştirin , ancak satırın geri kalanını (her durumda farklı olan) olduğu gibi bırakın. Bu nasıl yapılır?


Bir regexp üzerinde cehenneme bağlı değilseniz, bir makro iyi olur. Bunun gibi basit durumlarda gerçekten önemli değil, ama biraz daha karmaşık bir şeyiniz varsa çok geçerli bir alternatif.
PhilippFrank

Yanıtlar:


19

Hadi bakalım:

:g/foo/t.|s//bar

Decomposing:

:g/foo/    " start a global command applied on all lines matching 'foo'
t.         " duplicate the current line (the cursor is now on the new line)
|          " chain a new command
s//bar     " substitute the last searched element with 'bar'

Çünkü gkomut arama deseni güncelleyecek, bu nedenle yedek komutu yerine deseni atlayabilirsiniz. (ref: :h :g, aramak search pattern).


Eski versiyon:

:g/foo/norm! yyp:s/foo/bar^M

Decomposing:

:g            start a global command
/foo/         apply only on lines having 'foo'
norm!         execute a normal command
yyp           duplicate the line
:s//bar       replace foo with bar on the line (the duplicated one)
^M            add enter to execute the substitution

^MBasın Ctrl+vve eklemek için enter.

Not : tKomutu öğrenmeden önce "eski" versiyonu buldum . Onu bırakacağım ama kullanmanızı tavsiye etmem. Birincisi daha temiz.


Çözüldü, 'daha basit sürüm' mükemmel çalıştı. Ancak ilk versiyon, hala başlayan satır ile sonuçlandı foo....
LB7979

garip, ^Maçıkladığım gibi girdin mi ?
nobe4

Benim hatam, o kadar iyi okumadım. İlk çözüm de işe yarıyor!
LB7979

Neden karmaşık versiyonu dahil etmekle uğraştığınızı bilmiyorum. Daha basit sürüm ... daha basittir. ;) (POSIX uyumlu olduğundan bahsetmiyorum bile.) Neden önce koymuyorsunuz?
Wildcard

1
Başlangıçta benim için daha doğal olan ilk sürümü buldum, çünkü o zaman farkında tdeğildim ve sonra ikincisini ekledim. Sırayı değiştireceğim, haklısın. İlki POSIX olmaya ne dersiniz?
nobe4

1

Her zaman böyle şeyler yapıyorum ve sadece bir şey yapıyorum %s/^foo \(.*\)/foo \1\rbar \1/(kısmen de bir kopyalama işlevi kullanarak akıllı bir şeye dönüştürülemeyen ve \(.*\)şimdiye kadar kas belleğimin bir parçası olan birçok benzer görev yaptığım için).

POSIX uyumlu olmadığından şüpheleniyorum (diğer vi klonlarında çalışmaz), ancak ^M( C-VReturn) kullanmak \rdiğer vi klonlarının çoğunda çalışıyor gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.