OBSERVAÇÃO: usar sed
é a maneira apropriada de fazer isso, conforme mostrado por @ Resposta de Anthon !
Só para mostrar como você pode fazer isso em vim
. Você pode usar o comando argdo
em vim
. Do :help argdo
em vim
:
:argdo[!] {cmd} Execute {cmd} for each file in the argument list.
Exemplo:
:args *.c
:argdo set ff=unix | update
Isso define a opção 'fileformat' como "unix" e grava o arquivo se estiver agora
mudou. Isso é feito para todos os arquivos *.c
.
Exemplo:
:args *.[ch]
:argdo %s/\<my_foo\>/My_Foo/ge | update
Isso altera a palavra "my_foo" para "My_Foo" em todos os arquivos *.c
e *.h
. O sinalizador "e" é usado para o comando :substitute
para evitar um erro nos arquivos em que
"my_foo" não é usado. :update
grava o arquivo somente se alterações foram feitas.
O comando :args <pattern>
informa a :argdo
quais arquivos você deseja executar o seguinte {cmd}
contra. Uma vez definida, você executa :argdo {cmd} | update
, em que {cmd}
pode ser sua substituição s/boy/Boy/g
.
Os arquivos estão abertos durante esta operação?
Parece que sim. Eu fiz o seguinte teste para confirmar isso.
$ for i in {1..3};do echo "dog" > file${i}.txt;done
$ head file*.txt
==> file1.txt <==
dog
==> file2.txt <==
dog
==> file3.txt <==
dog
Agora, vá para vim
e faça os seguintes comandos:
:args file*.txt
Você pode confirmar que todos foram abertos:
:ls
2 %a "file1.txt" line 1
3 "file2.txt" line 0
4 "file3.txt" line 0
Fazer :argdo ...
:
:argdo %s/dog/cat/g | update
"file1.txt" 1L, 4C written
"file2.txt" 1L, 4C written
"file3.txt" 1L, 4C written
Portanto, tenha isso em mente se você pretende usar essa abordagem. Ele abre ineficientemente todos os arquivos que correspondem ao seu padrão para :args
e aplica o comando a eles por vez.