Remove texto de um arquivo e salva, sem abrir

0

Estou removendo linhas duplicadas de texto de vários arquivos. O comando que estou tentando usar é

sed -i 's/set autologout=10//g' /home/$x/.login

Quando eu executo, recebo esse erro

sed: -I or -i may not be used with stdin

O comando é executado com sucesso sem a opção -i , mas não é salvo. Eu estou escrevendo isso como estou modificando 2 arquivos por conta em cada servidor. Eu posso codificar isso com uma exceção feia, não consigo salvá-lo.

    
por Steve 14.03.2017 / 20:06

2 respostas

2

O que o comentário de @ don_crissti se refere, é o fato de que BSD sed parece para exigir um argumento para -i , e se -e não for usado, o primeiro argumento será considerado como o comando sed . Que não deixa nenhum para o arquivo de entrada, com o padrão de stdin , e você não pode editar esse "in-loco".

É o oposto, digamos, de GNU sed, que tem -i argumento opcional .

Ou, em outras palavras, seu sed pode estar interpretando o s/set autologout=10//g como um parâmetro para -i , a extensão a ser usada para o arquivo de backup. Então, se você não quiser deixar um arquivo de backup, apenas dê um argumento vazio à opção -i :

sed -i "" 's/set autologout=10//g' /home/$x/.login
    
por 14.03.2017 / 20:13
1

Para a solução POSIX, você pode usar o Vim no modo Ex:

ex -sc '%s/set autologout=10//g|x' /home/"$x"/.login
  1. % seleciona todas as linhas

  2. | separador de comandos

  3. x escreve no arquivo se tiverem sido feitas alterações (elas tiverem) e sair

  4. "$x" é ruim para deixar a variável sem aspas neste caso

por 14.03.2017 / 20:25