Eu quero usar sed
para substituir a tag XML em arquivos bash
.
Aqui está o exemplo de conteúdo xml para teste:
<xml-content>
<validation>
<timeout>2880</timeout>
<subject>example</subject>
<required>true</required>
</validation>
</xml-content>
Eu quero substituir a tag validation
:
<validation>
<timeout>2880</timeout>
<subject>example</subject>
<required>true</required>
</validation>
com a nova etiqueta other-tag
:
<other-tag>
<hello/>
<more>false</more>
</other-tag>
Aqui está o resultado final esperado:
<xml-content>
<other-tag>
<hello/>
<more>false</more>
</other-tag>
</xml-content>
Como fazer isso com uma única linha de comando sed
?
Com
sed
você pode selecionar todas as linhas em um arquivo entre dois padrões ( incluindo as duas linhas que contêmPAT1
ePAT2
) e substituí-las da seguinte forma:REPLACEMENT
é o texto, que tem cada nova linha incorporada precedida por uma barra invertida.Observe que se
PAT1
ouPAT2
contiver barras de prefácio/
, cada uma delas deve ser escapada com uma barra invertida\/
ou o delimitador deve ser alterado para algo diferente de/
e, nesse caso, você precisa escapar do primeiro de cada sequência delimitadora quando oc \
comando ou qualquer outrosed
comando é usado, por exemplo, você pode alterar o delimitador para_
:Então você pode fazer:
para editar isso:
para isso:
Observe que a
sed
opção s-i
é necessária se você quiser editar o arquivo original no local ... Teste sem ele primeiro e use-o com um sufixo de backup, por exemplo,-i.back
para salvar uma cópia de backup do arquivo original com.back
extensão, oufile.back
seja:Observe também que existem ferramentas feitas especialmente para editar arquivos XML que você pode usar para atualizar, excluir ou inserir elementos XML ... Veja Como faço para substituir vários campos em vários arquivos XML? como um exemplo... Essas ferramentas, no entanto, podem exigir um script de comando um pouco mais complexo do que o necessário
sed
em alguns casos de uso como o seu... Entendo por que você pediu uma solução e tambémsed
prefiro ferramentas XML especializadas parased
tal tarefa ... Além disso,sed
seria mais portátil, é claro.