Eu executo este comando para encontrar e substituir todas as ocorrências de 'apple' por 'orange' em todos os arquivos na raiz do meu site:
find ./ -exec sed -i 's/apple/orange/g' {} \;
Mas não passa por subdiretórios.
O que há de errado com este comando?
Aqui estão algumas linhas de saída de find ./
:
./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php
linux
command-line
sed
replace
hd.
fonte
fonte
find ./
e postar alguma saída de amostra? E a estrutura de diretórios, por favor. editar: obrigado!Respostas:
Sua descoberta deve ser assim para evitar o envio de nomes de diretório para sed:
fonte
sed -i 's/apple/orange/g'
parased -i '' 's/apple/orange/g'
para que isso funcione.-i
usa um argumento: a extensão usada para salvar o arquivo temporário. No GNU sed, parece que não há espaço entre eles-i
e seu argumento, mas no BSD sed existe ... então o BSD-i '' 's/foo/bar/'
é equivalente ao GNU-i 's/foo/bar/
.-e
não funciona no Mac OS.touch a b c d e
seguido pelo comando acima produz uma listagem como esta:a a-e b b-e c c-e d d-e e e-e
.RE error: illegal byte sequence
'{}'
, porque o peixe expande automaticamente os colchetes vazios se não estiver entre aspas.Para tarefas s & r maiores, é melhor e mais rápido usar grep e xargs, por exemplo;
fonte
git grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
Isso funcionou para mim:
fonte
*.php
está realmente incorreto; você teve sorte de não ter sido expandido no diretório inicial porque não havia nenhum arquivo correspondente lá.fonte
Como também existem pessoas do macOS lendo este (como eu fiz), o código a seguir funcionou para mim (na versão 10.14)
Todas as outras respostas usam
-i
e-e
não funcionam no macOS.Fonte
fonte
Acho que podemos fazer isso com um comando simples de uma linha
Consulte esta página .
fonte
No linuxOS:
se "sed" não funcionar, tente:
fonte