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.sed
atribui 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.sed
atribui 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.sed
atribui 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.