Gostaria de editar um arquivo com o sed no OS X. Estou usando o seguinte comando:
sed 's/oldword/newword/' file.txt
A saída é enviada para o terminal. file.txt não foi modificado. As alterações são salvas no arquivo2.txt com este comando:
sed 's/oldword/newword/' file1.txt > file2.txt
No entanto, eu não quero outro arquivo. Eu só quero editar file1.txt . Como posso fazer isso?
Eu tentei a bandeira -i. Isso resulta no seguinte erro:
sed: 1: "file1.txt": invalid command code f
-i
bandeira?Respostas:
Você pode usar o
-i
sinalizador corretamente fornecendo um sufixo para adicionar ao arquivo de backup. Estendendo seu exemplo:Você fornecerá dois arquivos: um com o nome
file1.txt
que contém a substituição e outro com o nomefile1.txt.bu
que possui o conteúdo original.Ligeiramente perigoso
Se você deseja sobrescrever destrutivamente o arquivo original, use algo como:
Devido à maneira como a linha é analisada, é necessário um espaço entre o sinalizador de opção e seu argumento, porque o argumento é de comprimento zero.
Além de possivelmente destruir o original, não conheço outros perigos de enganar dessa maneira. Deve-se notar, no entanto, que se essa invocação fizer
sed
parte de um script, o The Unix Way ™ (IMHO) deve ser usado de maneirased
não destrutiva, testando se saiu corretamente e somente depois removendo o arquivo estranho.fonte
-i''
perigoso por qualquer motivo, além de potencialmente atrapalhar o arquivo original (e não ter backup)?sed
página do manual, se você ficar sem espaço em disco no dispositivo, poderá corromper um arquivo no meio do caminho e ter um resultado de saída ruim. Se você estiver trabalhando sob o controle de origem localsed -i ""
sem backups, deverá ficar bem a maior parte do tempo (ou imediatamentegit init && git add -A . && git commit -m 'backup'
antes de executar o-i
modo sed ).-i''
é válido, mas-i ''
não é.Eu tenho problema semelhante com o MacOS
não funciona, mas
funciona bem.
fonte
sed -i '' <file>
funciona massed -i'' <file>
não funciona maisfonte
Você pode usar
-i''
(--in-place
)sed
como já sugerido. Veja: O-i
argumento in-loco , no entanto, observe que a-i
opção é extensões não-padrão do FreeBSD e pode não estar disponível em outros sistemas operacionais. Em segundo lugar,sed
é um editor ED do S tream , não um editor de arquivos .Uma maneira alternativa é usar a substituição embutida no modo Vim Ex, como:
e para vários arquivos:
Para editar todos os arquivos recursivamente, você pode usar
**/*.*
se o shell suportar isso (ativar porshopt -s globstar
).Outra maneira é usar
gawk
e sua nova extensão "local" , como:fonte
Isso cria arquivos de backup. Por exemplo,
sed -i -e 's/hello/hello world/' testfile
para mim, cria um arquivo de backup, testfile-e, no mesmo diretório.fonte
Você pode usar:
Exemplo:
Isso funciona perfeitamente no Mac .
fonte
-i
requer um argumento para o macOS. Como você não especifica um, ele usa-e
, o que resulta em ter um segundo arquivo-e
anexado.-e
não existe no macOS, é-E
. O comando tão correto para o macOS ésed -i '' -E 's/Hello/Bye/' file.txt