Yo estoy usando el comando sed para insertar un elemento xml en el archivo xml existente.

Tengo el archivo xml

<Students>
    <student>
        <name>john</>
        <id>123</id>
    </student>
    <student>
        <name>mike</name>
        <id>234</id>
    </student>
</Students>

Quiero agregar nuevo elememt como

    <student>
        <name>NewName</name>
        <id>NewID</id>
    </student>

Así que mi nuevo fichero xml se

<Students>
    <student>
        <name>john</>
        <id>123</id>
    </student>
    <student>
        <name>mike</name>
        <id>234</id>
    </student>
    <student>
        <name>NewName</name>
        <id>NewID</id>
    </student>
</Students>

Para esto he escrito secuencia de comandos de shell como

#! /bin/bash

CONTENT="<student>
            <name>NewName</name>
            <id>NewID</id>
        </student>"

#sed -i.bak '/<\/Students>/i \ "$CONTENT" /root/1.xml
sed -i.bak '/<\/Students>/i \'$CONTENT'/' /root/1.xml

Estoy recibiendo el error como

sed: can't read <name>NewName</name>: No such file or directory
sed: can't read <id>NewID</id>: No such file or directory
sed: can't read </student>: No such file or directory

Y en el archivo xml, sólo <student> se agrega.
El resto de los elementos no se agregan.
¿Alguien sabe por qué este error?

  • Existen varias herramientas para manipular archivos XML. Utilizarlas en lugar de las expresiones regulares.
  • estaría bien hacer una lista de uno (o dos) de estas herramientas
InformationsquelleAutor User007 | 2014-04-23

3 Comentarios

  1. 6

    cambiar esta:

    CONTENT="<student>
                <name>NewName</name>
                <id>NewID</id>
            </student>"

    a este:

    CONTENT="<student>\n<name>NewName</name>\n<id>NewID</id>\n</student>"

    y luego:

    C=$(echo $CONTENT | sed 's/\//\\//g')
    sed "/<\/Students>/s/.*/${C}\n&/" file
    • Si mi etiqueta <nombre>Nuevo Nombre</name>, entonces ¿cómo se puede manejar el espacio en blanco aquí? ‘\t’ añadirá una ficha y necesito espacio en blanco único
    • ver editado.
  2. 3

    No se puede tener una sin escape de nueva línea en el sed texto de sustitución, que es $CONTENT en su ejemplo. sed utiliza el salto de línea como la shell, para terminar un comando.

    Si usted necesita un salto de línea en el texto de reemplazo, usted necesita ir con una barra diagonal inversa.

    Hay otra forma de añadir texto usando el r opción. Por ejemplo:

    Digamos que su archivo principal;

    $ cat file
    <Students>
        <student>
            <name>john</>
            <id>123</id>
        </student>
        <student>
            <name>mike</name>
            <id>234</id>
        </student>
    </Students>

    Texto que desea agregar en otro archivo (no variable):

    $ cat add.txt
        <student>
            <name>NewName</name>
            <id>NewID</id>
        </student>

    Que usted puede hacer (usando gnu sed):

    $ sed '/<\/Students>/{ 
        r add.txt
        a \</Students>
        d 
    }' file
    <Students>
        <student>
            <name>john</>
            <id>123</id>
        </student>
        <student>
            <name>mike</name>
            <id>234</id>
        </student>
        <student>
            <name>NewName</name>
            <id>NewID</id>
        </student>
    </Students>

    Sin embargo, después de haber dado esta opción, es una muy mala idea para analizar xml con la expresión regular. Esto hace que la solución muy frágil y fácil de romper. Consideramos esto como un ejercicio de aprendizaje única.

  3. 0

    Esto podría funcionar para usted (GNU sed & Bash):

    CONTENT='    <student>\
        <name>NewName</name>\
        <id>NewID</id>\
    </student>'
    
    sed '/<\/Students>/i\'"$CONTENT" file

    Alternativamente, poner los nuevos estudiantes en un archivo y:

    sed '/<\/Students>/e cat new_student_file' file
    • Aquí si la etiqueta es como <nombre>Nuevo Nombre</name>, entonces ¿cómo puedo manejar este espacio en blanco.
    • para la variable sólo recuerde que el último carácter de cada línea (excepto el último) debe terminar en `\`. Para el archivo de la solución de escribir el texto, como se puede ver.

Dejar respuesta

Please enter your comment!
Please enter your name here