Como posso obter meu comando sed para fazer alterações permanentes em um arquivo?

32

Isso é possível? Li em algum lugar que o seguinte comando faria isso:

sed -e [comando] [arquivo]

mas parecia fazer a mesma coisa que apenas

sed [comando] [arquivo]

(não salvou as alterações). Existe alguma maneira de fazer isso usando o sed?

John
fonte
2
A -ebandeira significa expressão. Você provavelmente vai querer a -ibandeira de que meios in-placee eu recomendo fortemente que você use sed -i.bak 's/../' filename
Valentin Bajrami

Respostas:

50

Eu acho que você está procurando -i:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

Por exemplo:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

Se você fornecer um sufixo, ele criará um arquivo de backup:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

O arquivo de entrada é modificado e um backup contendo os dados do arquivo original é criado.

Observe também que este é para o GNU sed, existem pequenas diferenças no formato entre diferentes sedimplementações.

terdon
fonte
4
Observe que a página do manual está errada. sednão faz edição no local. Ele cria um novo arquivo e sobrescreve o antigo, o inode muda.
Marco
2
@Marco Essa é a maneira segura de editar um arquivo no local. “Editando um arquivo no local” na documentação sed significa que o arquivo original (conforme definido pelo nome) é modificado, não que o arquivo original (conforme definido pelo seu inode) seja modificado.
Gilles 'SO- stop be evil'
2
@ Gilles Eu concordo totalmente que essa é a maneira preferida de editar um arquivo, mas eu dificilmente chamaria isso de lugar . Mas isso se resume à questão de como um arquivo é identificado, por inode ou por nome. Eu diria que por inode, caso contrário, controla como { rm file; cmd > file; } < filelevaria à conclusão de que o cmd lê e grava no mesmo arquivo, o que não acontece. São dois arquivos distintos que, por acaso, têm o mesmo nome. Mas não quero iniciar uma discussão aqui.
Marco
No macOS 10.14, recebo sed: 1: "foo.txt": invalid command code fao executar sed -i 's/o/X/g' foo.txt. No entanto, fornecer uma extensão, como sed -i .bak 's/o/X/g' foo.txtfunciona bem. Alguma idéia de como fazê-lo funcionar sem criar arquivos de backup?
Joshua Pinter
1
Ok, entendi. No macOS, você precisa adicionar explicitamente uma string vazia para a opção param de extensão:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter 29/11
2

Esta solução funciona para HPUX (UNIX):

1 { rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh.:

2) perl -pi -e 's/Error/NO_Error/g' test1.sh

3) sed 's/Error/NO_Error/g' test1.sh | tee test1.sh

user3114790
fonte
Você não pode usar tee askubuntu.com/a/752451
Steven Penny
1

-eopção é para executar vários sedcomandos

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

considere file.txtcomo

linux os

então O / P é

unix os

-i opção salva as alterações permanentemente ...

user195318
fonte