Se sed
não for um requisito difícil, use melhor uma ferramenta dedicada.
Se o seu arquivo é XML válido (não apenas aquelas 3 tags com aparência XML), então você pode usar o XMLStarlet :
xml ed -P -O -L \
-u '//username/text()' -v 'something' \
-u '//password/text()' -v 'somethingelse' \
-u '//dbname/text()' -v 'somethingdifferent' file.xml
Os itens acima também funcionarão em situações que seriam difíceis de resolver com expressões regulares:
- Pode substituir os valores das tags sem especificar seus valores atuais.
- É possível substituir os valores mesmo se eles tiverem acabado de escapar e não estiverem incluídos no CDATA.
- Pode substituir os valores mesmo se as tags tiverem atributos.
- É possível substituir facilmente apenas as ocorrências de tags, se houver várias com o mesmo nome.
- Pode formatar o XML modificado indentificando-o.
Breve demonstração do acima:
bash-4.2$ cat file.xml
<sith>
<master>
<username><![CDATA[name]]></username>
</master>
<apprentice>
<username><![CDATA[name]]></username>
<password>password</password>
<dbname foo="bar"><![CDATA[name]]></dbname>
</apprentice>
</sith>
bash-4.2$ xml ed -O -u '//apprentice/username/text()' -v 'something' -u '//password/text()' -v 'somethingelse' -u '//dbname/text()' -v 'somethingdifferent' file.xml
<sith>
<master>
<username><![CDATA[name]]></username>
</master>
<apprentice>
<username><![CDATA[something]]></username>
<password>somethingelse</password>
<dbname foo="bar"><![CDATA[somethingdifferent]]></dbname>
</apprentice>
</sith>