Em geral, o processamento XML deve ser feito com um analisador XML .
ATUALIZAÇÃO: Na verdade, eu acho infeliz que esta resposta tenha sido escolhida como a "resposta aceita" porque a resposta do @SatoKatsura está correta e melhor. Ele usa um analisador XML adequado e é mais curto. Veja também os comentários do @cas à minha resposta. A análise XML realmente deve não ser tentada com ferramentas orientadas a linha.
No entanto, tratando você documento como texto simples:
#!/usr/bin/sed -f
/argument name="protocol"/{
i\
<argument name="protocol" is-required="true" default-value="tcp"/>
d
}
/argument name="port"/{
i\
<argument name="port" is-required="true" default-value="7223"/>
d
}
/argument name="username"/{
i\
<argument name="username" is-required="true" default-value="test"/>
d
}
Este script sed
encontrará as linhas que você deseja modificar e substituirá a linha inteira por uma linha contendo o XML que você deseja.
Eu estou escolhendo fazer isso de uma maneira bem pesada, porque isso lhe dá uma maneira fácil de mudar os valores para o que você quiser, e não depende de muita magia em expressões regulares.
EDITAR:
O script iria para um arquivo próprio, talvez script.sed
. Você então executaria com
$ sed -f script.sed data.xml >data.new
Isso aplicará o script ao arquivo data.xml
e gerará o resultado no arquivo data.new
.
O seguinte é um script que permite definir os valores do protocolo, porta e usuário, bem como quais arquivos de dados devem ser lidos e gravados:
#!/bin/sh
xmlfile_in="data.xml"
xmlfile_out="data.new"
protocol="tcp"
port="7223"
user="test"
sed -f /dev/stdin "$xmlfile_in" >"$xmlfile_out" <<END_SED
/argument name="protocol"/{
i\
<argument name="protocol" is-required="true" default-value="$protocol"/>
d
}
/argument name="port"/{
i\
<argument name="port" is-required="true" default-value="$port"/>
d
}
/argument name="username"/{
i\
<argument name="username" is-required="true" default-value="$user"/>
d
}
END_SED