Sådan søges og erstattes på tværs af flere filer i Vim
I denne artikel lærer du, hvordan du interaktivt søger og udskifter på tværs af mange filer med kun to kommandoer takket være Vim.
Mens der findes en lang række metoder til at søge efter og erstatte ord i en enkelt fil, hvad gør du, når du har en streng til at opdatere på tværs af flere ikke-relaterede filer, alle med forskellige navne? Du bruger selvfølgelig kraften i kommandolinjeværktøjer!
Først skal du find
alle de filer, du vil ændre. At samle, hvad der effektivt er søgeforespørgsler efter, find
er faktisk kun begrænset af din fantasi.
Her er et simpelt eksempel, der finder Python-filer:
find . -name '*.py'
De -name
test søger efter et mønster, såsom alle filer der ender på .py
. Men find
kan gøre meget mere med andre testbetingelser, herunder -regex
tests. Kør for find --help
at se de mange muligheder.
Indstil din søgning yderligere ved grep
kun at hente de filer, der indeholder den streng, du vil ændre, f.eks. Ved at tilføje:
grep -le '\'
Den -l
mulighed giver dig bare filnavnene for alle filer, der indeholder et mønster (angivet med -e
), der matcher ”en hval”.
Du kan også bruge Vims imponerende, :bufdo
som lader dig køre den samme kommando på tværs af flere buffere. Det fungerer interaktivt med alle disse filer uden kedeligt at åbne, gemme og lukke hver fil, en ad gangen.
Lad os sætte dine stærke find
+ grep
resultater i Vim med:
vim `find . -name '*.py' \ -exec grep -le '\' {} \;`
Brug af backtick-udvidelse til at overføre vores søgning til Vim åbner flere buffere klar til brug. (Gør :h backtick-expansion
i Vim for mere.)
Nu kan du anvende Vim-kommandoen :bufdo
på alle disse filer og udføre handlinger såsom interaktiv søgning og erstat:
:bufdo %s/a whale/a bowl of petunias/gce
For g
"global" vil forekomsten af mønsteret ændre på alle linjer. Den e
vil udelade fejl, hvis mønstret ikke er fundet. Den c
valgmulighed gør denne interaktive. Hvis du føler dig selvsikker, kan du udelade det for at foretage ændringerne uden at gennemgå hver enkelt.
Når du er færdig med at gennemgå alle bufferne, skal du gemme alt det arbejde, du har afsluttet med:
:bufdo wq!
Sæt dig derefter i glans over din sparede tid og kræfter.