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.
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
-e
bandeira significa expressão. Você provavelmente vai querer a-i
bandeira de que meiosin-place
e eu recomendo fortemente que você usesed -i.bak 's/../' filename
Respostas:
Eu acho que você está procurando
-i
:Por exemplo:
Se você fornecer um sufixo, ele criará um arquivo de backup:
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 diferentessed
implementações.fonte
sed
não faz edição no local. Ele cria um novo arquivo e sobrescreve o antigo, o inode muda.{ rm file; cmd > file; } < file
levaria à 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.sed: 1: "foo.txt": invalid command code f
ao executarsed -i 's/o/X/g' foo.txt
. No entanto, fornecer uma extensão, comosed -i .bak 's/o/X/g' foo.txt
funciona bem. Alguma idéia de como fazê-lo funcionar sem criar arquivos de backup?sed -i '' 's/o/X/g' foo.txt
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
fonte
-e
opção é para executar váriossed
comandosconsidere
file.txt
comoentão O / P é
-i
opção salva as alterações permanentemente ...fonte