Eu usaria awk
se o formato não divergir da amostra que você forneceu:
awk -F'[<>="[:blank:]]+' '
$2 == "domain" {group = $(NF-1)}
!(group == "group1" && $2 == "node" && $(NF-1) == "PQR")
' < dest.xml > new-dest.xml
para remover o nó "PQR" no domínio "group1".
$ diff -u dest.xml new-dest.xml
--- dest.xml 2013-02-22 07:01:48.732227421 +0000
+++ new-dest.xml 2013-02-22 07:02:16.111512820 +0000
@@ -1,6 +1,5 @@
<domain id="1" group_name="group1">
<node id="ABC">
- <node id="PQR">
<node id="XYZ">
</domain>
<domain id="2" group_name="group2">
Se você quiser remover esse nó do arquivo XML, isso não é realmente possível. Você precisaria pelo menos reescrever a parte que está depois desse nó para mudar os dados em bytes para trás.
Como alternativa, você poderia substituir esse nó por espaços em branco, o que significaria que você poderia se safar com a substituição apenas desses bytes.
perl -ne '
if (/<domain.*group_name="(.*?)"/) {
$in = $1 eq "group1"
} elsif ($in && /<node id="PQR"/) {
s/./ /g;
seek STDOUT,tell(STDIN)-length$_,0;
print
}' < dest.xml 1<> dest.xml
Adicione um ;exit
após o print
acima, se houver apenas um desses nós e você quiser interromper o processamento assim que o encontrar.