MacOS: Como posso inserir uma linha em um arquivo XML com base no nome do arquivo? [fechadas]

1

Eu não tenho acesso a uma caixa Linux pura. Eu tenho um monte de arquivos XML que estão faltando uma linha de chamada de nome de arquivo. Eu preciso inserir essa linha em um local específico no arquivo XML e ter o nome do arquivo chamado gerada fora do nome do arquivo XML, com uma pequena transformação.

Exemplo:

24ToLife_AFamilyDivided_191045_DANY.xml tem

<description>Entrepreneur James overcame unconscionable childhood abuse before the sins of his past came back to haunt him.</description>
<media:rating>TV-14</media:rating>

Eu preciso ler:

<description>Entrepreneur James overcame unconscionable childhood abuse before the sins of his past came back to haunt him.</description>
<media:content url="24ToLife_AFamilyDivided_191045.mpg" type="video/mpg" expression="full" />
<media:rating>TV-14</media:rating>
    
por Alex M 04.04.2018 / 18:50

2 respostas

0

Acabei de escrever e testar no MacOS High Sierra:

#!/bin/sh

for fl in *.xml
do
    filename=$(echo $fl | cut -f 1 -d '.' | sed 's/_DANY$//')

    sed -i .orig '1a\
    <media:content url="'$filename'.mpg" type="video/mpg" expression="full" /> \
    ' $fl
done

ls *.xml     search in current directory
-i .orig     backup of original files with suffix
'1a ..'      insert into second line

O BSD sed no MacOS tem várias diferenças do GNU sed , portanto, a seguinte expressão deve ser escrita em linhas separadas:

'1a \        # backslash and newline
 some text'  

O símbolo Newline \n não é reconhecido, então você deve escrever:

'1a \
some text   # newline here
'

em vez de:

'1a \
some text\n'

Uso:

yurijs-MacBook-Pro:sed yurij$ cat *.xml
<description>Entrepreneur James overcame unconscionable childhood abuse before the sins of his past came back to haunt him.</description>
<media:rating>TV-14</media:rating>
<description>Entrepreneur James overcame unconscionable childhood abuse before the sins of his past came back to haunt him.</description>
<media:rating>TV-14</media:rating>
yurijs-MacBook-Pro:sed yurij$ ./cli
yurijs-MacBook-Pro:sed yurij$ cat *.xml
<description>Entrepreneur James overcame unconscionable childhood abuse before the sins of his past came back to haunt him.</description>
<media:content url="24ToLife_AFamilyDivided_191045.mpg" type="video/mpg" expression="full" />
<media:rating>TV-14</media:rating>
<description>Entrepreneur James overcame unconscionable childhood abuse before the sins of his past came back to haunt him.</description>
<media:content url="tt.mpg" type="video/mpg" expression="full" />
<media:rating>TV-14</media:rating>
    
por 04.04.2018 / 20:08
0

Aqui está um script python que deve fazer o que você quer:

#!/usr/bin/env python
# -*- encoding: ascii -*-
"""insert_xml.py"""

import sys
from bs4 import BeautifulSoup as Soup

# Get the filename from the command-line
filename = sys.argv[1]

with open(filename, 'r') as xmlfile:

    # Parse the file
    soup = Soup(xmlfile.read(), "html.parser")

    # Search for "description" tags
    for element in soup.findAll("description"):

        # Check to see if the "media:content" element is missing
        if element and not element.find_next_sibling("media:content"):

            # If so, construct a new "media:content" tag
            new_tag = soup.new_tag('media:content')
            new_tag["url"] = filename
            new_tag["type"] = "video/mpg"
            new_tag["expression"] = "full"

            # Insert the "media:content" tag after the "description" tag
            element.insert_after(new_tag)

    # Print the modified XML document - one element per line
    for element in soup.findAll():
        print(element)

Veja o que parece em ação:

$ python insert_xml.py in.xml

<description>Entrepreneur James overcame unconscionable childhood abuse before the sins of his past came back to haunt him.</description>
<media:content expression="full" type="video/mpg" url="in.xml"></media:content>
<media:rating>TV-14</media:rating>
    
por 04.04.2018 / 23:04