você está aqui: Home  → Arquivo de Mensagens

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/).



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

 

 

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script