XMLs podem ser e geralmente são difíceis de serem manipulados com as boas e velhas ferramentas de shell; é preciso usar analisadores XML, procurando por nós. No entanto, se e somente se o formato de seus arquivos é realmente tão simples quanto escrito (quebras de linha estão sempre lá, as tags importantes não são aninhadas em outras tags e elas iniciam as linhas), então isso pode ser feito com start-tag-to Correspondência de padrões de tag de finalização.
$ cat mergexml.awk
FILENAME!=fn { ++fcnt; fn = FILENAME }
fcnt == 1 {
print
str = $0
if ( inside ) {
if ( str ~ "^ *</ *" tag " *> *$") {
inside = 0
}
} else {
gsub( /^ *< *| *> *$/, "", str)
if ( str ~ /^[[:alnum:]_]+$/) {
tag = str
f1tags[tag] = ""
inside = 1
}
}
}
fcnt == 2 {
str = $0
if ( inside ) {
print
if ( str ~ "^ *</ *" tag " *> *$") {
inside = 0
}
} else {
gsub( /^ *< *| *> *$/, "", str)
if ( str ~ /^[[:alnum:]_]+$/) {
tag = str
if ( ! (tag in f1tags)) {
inside = 1
print
}
}
}
}
$ awk -f mergexml.awk file1 file2
<SERVERNAME_ONE>
<Protocol>FTP</Protocol>
<ServerIP>192.168.0.231</ServerIP>
</SERVERNAME_ONE>
<SERVERNAME_TWO>
<Protocol>FTP</Protocol>
<ServerIP>192.168.13.231</ServerIP>
</SERVERNAME_TWO>
A ordem dos arquivos na linha de comando é importante .