De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Substituição com sed

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 25 de Outubro de 2002

Recentemente precisei zerar o campo da senha do usuário root no arquivo /etc/shadow.

A linha que eu precisava mudar tem o seguinte formato:

  root:$1$GpYaenSE$8mXEvGgDvJ.0KNk2uhlRr0:11901:0:99999:7:::

Os campos são separados pelo caractere ":". Então:

  sed 's/^root:.*:/root::/' /etc/shadow

e fiquei com

  root::

Ao que parece a coisa foi longe demais. Na expressão ^root:.*: o sed substituiu tudo até o último ":". Acontece que, no jargão das expressões regulares, o comando é "guloso". Ele saiu trocando tudo, inclusive o caractere ":" até achar o último ":" na linha, o que deu um resultado totalmente diverso do que eu esperava. O jeito foi fazer:

  sed 's/^root:[^:]*:/root::/' /etc/shadow

Desta vez deu certo:

  root::11901:0:99999:7:::

A expressão "[^:]" significa "case com qualquer caractere exceto o caractere ":"".

Como o sed na verdade não faz a mudança no arquivo, eu preciso completar o comando:

  # cp /etc/shadow /tmp/shadow 
  # sed 's/^root:[^:]*:/root::/' /tmp/shadow > /etc/shadow
  # rm /tmp/shadow

A saída do comando é redirecionada, a partir do arquivo temporário. Ao final, movo o arquivo temporário para o lugar definitivo (/etc/shadow).

Esta é apenas uma das muitas facilidades que o sed oferece.

Para saber mais sobre expressões regulares o melhor caminho é ler o livro do Aurélio Marinho Jargas, "Expressões Regulares", publicado pela editora NOVATEC (http://novateceditora.com.br/guias/expreg/).

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Rubens Queiroz de Almeida