use sed para substituir parte de uma string

2

Estou planejando substituir certas strings em um arquivo; então estou usando sed.

Eu gostaria de ter a string substituída, enquanto em vez disso, sed leu a string e anexou o texto no meio da string.

Exemplo:

string in myfile : user=blabla
string that I want to obtain: user=bob

então eu executo o sed dessa forma, para que ele procure a string "user=" e substitua por "user = bob"

sed -i 's/user=*/user=bob/' myfile

O que eu recebo é

user=bobblabla

Basicamente sed acho que eu quero substituir apenas essa parte, enquanto eu quero substituir a string inteira com a nova string. Eu pensei que o * diria ao sed para considerar qualquer coisa depois, mas não funciona.

Como não sei qual será o "blabla", não posso colocá-lo no comando sed. Como eu digo ao sed para encontrar uma string que comece com "user=" e substitua toda a string pela nova?

    
por rataplan 27.01.2015 / 02:10

2 respostas

5

Você parece confundir padrões de shell com expressões regulares. Em um padrão de shell, * significa zero ou mais de qualquer caractere. Em uma expressão regular, que é o que sed espera em seus padrões, * significa zero ou mais do átomo anterior. No seu exemplo, esse átomo é o = . Portanto, sed está pesquisando por user seguido por zero ou mais = e substituindo a string correspondente por user=bob . O padrão que você deseja é user=.* , que é user= seguido por qualquer caractere ( . ) zero ou mais vezes, tornando seu comando sed :

sed -i 's/user=.*/user=bob/' myfile
    
por 27.01.2015 / 02:18
2

Como GaryJohn disse, você entendeu errado o regex. (* - >. *)

Mas eu iria um pouco mais longe, enquanto você está nisso ... Eu não sei como é o seu arquivo, mas apenas para praticar, eu gostaria de fazer um pouco de sua operação de busca / substituição. mais seguro.

Digamos que você queira executar a tarefa em um arquivo como este:

user=john
superuser=jimmy      # don't want to change this line!
user=L33t_us3rn4m3   # that should work too, and these comments should remain intact as well, btw
# in the line below, I want to change user=hello to user=bob
# but in the comments, "user=hello" should remain intact
user=hello

Com a sua sintaxe atual de sed, isso seria completamente errado. Para torná-lo um pouco mais específico, você pode tentar:

sed -i 's/^user=[A-Za-z0-9_]*/user=bob/g' /tmp/myfile

Isto irá:

  • é acionado apenas quando a linha realmente começa com "usuário" (o ^)
  • altere apenas "user=" na medida em que consiste em 0 ou mais letras, dígitos ou sublinhados
  • deixe tudo por trás do nome de usuário (ou seja, os comentários no meu exemplo) intacta

Isso não é de forma alguma uma coisa super segura que funcionará sempre e em todos os lugares onde você deseja renomear usuários. Obviamente, isso depende de como seu arquivo de configuração está configurado e o que você esperaria encontrar. Mas minha resposta é para dar um pouco de "comida para o pensamento", porque dado um (número de) arquivo (s) de configuração grande o suficiente para esperar tantos nomes de usuários não querer fazer isso manualmente, cegamente substituindo "user =. * "parece possivelmente perigoso. Você pode querer passar algum tempo polindo esses tipos de operações:)

Boa sorte.

    
por 27.01.2015 / 04:23

Tags