Usei com sucesso o seguinte sed
comando para pesquisar / substituir texto no Linux:
sed -i 's/old_link/new_link/g' *
No entanto, quando tento no meu Mac OS X, recebo:
"comando c espera \ seguido de texto"
Eu pensei que meu Mac roda um shell BASH normal. E aí?
EDITAR:
De acordo com o @High Performance, isso se deve ao fato de o Mac sed
ter um sabor diferente (BSD), portanto, minha pergunta seria como replicar esse comando no BSD sed
?
EDITAR:
Aqui está um exemplo real que causa isso:
sed -i 's/hello/gbye/g' *
sed
vê um "c" nos seus dados como um comando. Você está usando uma variável? Poste algo que represente mais de perto o comando real e alguns dados que você está processando. Você pode obter uma demonstração simples desse erro fazendo issoecho x | sed c
.Respostas:
Se você usar a
-i
opção, precisará fornecer uma extensão para seus backups.Se você tem:
O comando (note a falta de espaço entre
-i
e''
e-e
fazê-lo funcionar em novas versões do Mac e no GNU):Crie 2 arquivos de backup como:
Não há uma maneira portátil de evitar a criação de arquivos de backup, porque é impossível encontrar uma mistura de comandos sed que funcione em todos os casos:
sed -i -e ...
- não funciona no OS X, pois cria-e
backupssed -i'' -e ...
- não funciona no OS X 10.6, mas funciona no 10.9 ou superiorsed -i '' -e ...
- não está trabalhando no GNUNota Como não há um comando sed funcionando em todas as plataformas, você pode tentar usar outro comando para obter o mesmo resultado.
Por exemplo,
perl -i -pe's/old_link/new_link/g' *
fonte
sed
sabe, você forneceu um sufixo de backup. O sufixo de backup és/old_link/new_link/g
. O próximo argumento depois disso deve ser os comandos de edição. Por interpretar os comandos como o nome do backup, o nome do arquivo foi o primeiro a ser utilizado como comando de edição, mas eles não eram válidos.sed -i '' -e ...
?sed -i'' -e
parece não funcionar como esperado no mac 10.14Acredito no OS X quando você usa -i, uma extensão para os arquivos de backup é necessária . Experimentar:
Usando o GNU,
sed
a extensão é opcional .fonte
Isso funciona com as versões GNU e BSD do sed:
ou com backup:
Observe a falta de espaço após a
-i
opção! (Necessário para GNU sed)fonte
rm
comando logo depois para excluí-lo.sed -i'' ...
=>sed -i '' ...
Teve o mesmo problema no Mac e resolveu-o com
brew
:e use como
você pode definir o
sed
alias comogsed
(se quiser):fonte
Ou você pode instalar a versão GNU do sed no seu Mac, chamada gsed, e usá-la usando a sintaxe padrão do Linux.
Para isso, instale
gsed
usando ports (se você não o tiver, obtenha-o em http://www.macports.org/ ) executandosudo port install gsed
. Então, você pode executarsed -i 's/old_link/new_link/g' *
fonte
gnu-sed
Seu Mac realmente executa um shell BASH, mas isso é mais uma questão de qual implementação do sed você está lidando. Em um Mac, o sed vem do BSD e é sutilmente diferente do sed que você pode encontrar em uma caixa típica do Linux. Eu sugiro você
man sed
.fonte
A resposta do Sinetris está certa, mas eu uso isso com o
find
comando para ser mais específico sobre quais arquivos eu quero alterar. Em geral, isso deve funcionar (testado no osx/bin/bash
):Em geral, o uso
sed
semfind
projetos complexos é menos eficiente.fonte
-exec
é muito legal! Eu só estou querendo saber se a barra no final é realmente precisa\
, o;
foi interpretado pelo shell quando tentei tal #Eu criei uma função para lidar com a
sed
diferença entre o MacOS (testado no MacOS 10.12) e outro sistema operacional:Uso:
Onde:
,
é um delimitador's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"','
é padrão"./mysql/.env"
é o caminho para o arquivofonte
Veja como aplicar variáveis de ambiente ao arquivo de modelo (sem necessidade de backup).
1. Crie um modelo com {{FOO}} para substituí-lo posteriormente.
2. Substitua {{FOO}} pela variável FOO e envie para o novo arquivo foo.conf
Trabalhando no macOS 10.12.4 e no Ubuntu 14.04.5
fonte
Como as outras respostas indicam, não há uma maneira de usar o sed portably no OS X e Linux sem criar arquivos de backup. Então, em vez disso, usei essa linha única do Ruby para fazer isso:
No meu caso, eu precisava chamá-lo de uma
rake
tarefa (ou seja, dentro de um script Ruby), então usei esse nível adicional de citação:fonte
Funciona no BSD e Linux
fonte
e
anexado