Como encontrar um texto, copiá-lo e inserir na próxima linha em um arquivo?

2

Estou tentando escrever um script que processe o arquivo .xml. Ele precisa encontrar todas as linhas com um elemento <title> , copiá-lo e colá-lo em uma próxima linha depois da encontrada, mas também alterando o tipo de elemento. Aqui está um exemplo.

Original:

some text
<title>text 1</title>
some text
<title>text 2</title>
some text

E isso é o que preciso obter:

some text
<title>text 1</title>
<description>text 1</description>
some text
<title>text 2</title>
<description>text 2</description>
some text

Pode ser feito com sed ou grep (ou alguma outra ferramenta)?

    
por xjr 11.07.2017 / 23:57

2 respostas

1

sed -E 's%<title>(.*)</title>%<title></title>\n<desc></desc>%g' file.xml deve fazer sua lição de casa.

Para explicar um pouco mais: O parâmetro -E informa sed para usar expressões regulares estendidas, portanto, você pode usar referências. Substituir com sed normalmente é feito na forma s/search/replace/g . Como há barras no texto de pesquisa, usamos % em vez de / para sed marcar as partes, portanto, não precisamos mascarar as barras no texto de pesquisa por uma barra invertida. O resto é coisa normal de regex, na parte de substituição faz referência ao fragmento dentro de (…) na parte de pesquisa.

    
por 12.07.2017 / 23:41
3

Analisadores / processadores XML são as ferramentas certas para manipular dados XML.

solução xmlstarlet :

o exemplar input.xml content:

<root>
some text
<title>text 1</title>
some text
<title>text 2</title>
some text </root>
xmlstarlet ed -a '//title' -t elem -n 'description' -v '' input.xml \
 | xmlstarlet ed -u '//description' -x './preceding-sibling::title[1]/text()'

A saída:

<?xml version="1.0"?>
<root>
some text
<title>text 1</title><description>text 1</description>
some text
<title>text 2</title><description>text 2</description>
some text </root>
  • ed - modo de edição

  • -a - ação de anexação

  • -u - ação de atualização

por 12.07.2017 / 00:20