Pensei em uma solução mais geral do que a sua pergunta.
Vamos imaginar que você precise encontrar uma string com base nos seus critérios de pesquisa de expressões regulares. Você gostaria de substituir apenas uma parte dela e deixar as outras partes correspondentes inalteradas.
Para demonstrar com um exemplo:
echo "'some-name'@'some-host'" | sed -r "s/(')([^']+)('@'[^']*')/user2/g"
exibirá:
'user2'@'some-host'
O comando sed executa a substituição usando a sintaxe s/search-regexp/replacement/g . No nosso caso:
-
(')corresponde à primeira cotação única. Isso é trivial, mas poderia ser mais complexo. Representa a parte da string antes da substituição.sedatribui o valor desta sub-expressão à variável especial. -
([^']+)corresponde ao nome do usuário. Basicamente qualquer personagem a partir da posição anterior que não é uma citação.sedatribui o valor desta sub-expressão à variável especial. -
('@'[^']*')corresponde à parte'@'host-name'. Da mesma forma que a subexpressão anterior, uma cotação, uma@, uma cotação novamente e qualquer caractere que não seja uma cotação e, em seguida, uma cotação no final.sedatribui o valor desta sub-expressão à variável especial.
A peça de substituição substituirá qualquer coisa que corresponda à regexp de pesquisa. Usando as variáveis mostradas acima, podemos substituir o nome do usuário e deixar as outras regiões intactas. + seu novo nome de usuário + produzirá o resultado desejado. Assim:
user2
Resultados em:
- Qualquer conteúdo que a primeira sub-expressão tenha (é uma aspa simples)
- seguido pela string "user2", (nota
intencionalmente não é usada, porque substituímos o nome de usuário) - e finalmente o conteúdo da terceira sub-expressão (que é um
'@e o nome do host entre aspas).
Se você cat do seu arquivo de script e canalizá-lo para o comando sed , você deve obter o resultado desejado.