O comando sed "i" espera \ seguido por texto, conforme explicado na saída de BSD sed quando recebe o comando fornecido acima.
No entanto, espera apenas uma linha de texto. Para inserir mais do que isso, você precisa incluir uma barra invertida no final da primeira linha:
sed "1i\
$(head -n 2 source.xml | sed 's/$/\/')
" sample.xml
Isso (aninhadas sed chamadas) fica um pouco ridículo. Como escrevi sobre em outro lugar , a ferramenta escolhida para edições de arquivos com scripts in-loco não é sed , mas ex :
ex -sc '1,2ya | n! | 0pu | x' source.xml sample.xml
O sinalizador -s inicia ex no modo silencioso, para processamento em lote. -c especifica o comando a ser executado.
1,2ya yanks (ou seja, cópias) as duas primeiras linhas do primeiro arquivo, source.xml .
| é o separador de comandos.
n! vai para o próximo arquivo, descartando as alterações feitas no arquivo atual. (Nós não fizemos nenhum neste caso, então n funcionaria tão bem).
0pu "puts" (ou seja, pastas) as linhas que copiamos anteriormente, colocando-as logo após a linha "0" (ou seja, colando-as acima da primeira linha).
x exits, salvando as alterações feitas no arquivo atual.
Ao contrário de sed -i , que não é especificado em POSIX (e que não funciona no BSD sed , que requer que uma extensão de arquivo de backup receba a opção -i , mesmo se vazia), o comando ex acima é totalmente compatível com POSIX .