2009-03-31 17 views
5

Tengo un archivo de texto de 2 GB en mi linux que estoy tratando de importar a mi base de datos.¿Cómo puedo reemplazar una línea específica por número de línea en un archivo de texto?

El problema que estoy teniendo es que el script que está procesando el archivo RDF está ahogando en una línea:

mismatched tag at line 25462599, column 2, byte 1455502679: 
<link r:resource="http://www.epuron.de/"/> 
<link r:resource="http://www.oekoworld.com/"/> 
</Topic> 
=^ 

que desea reemplazar el </Topic> con </Line>. No puedo hacer una búsqueda/reemplazo en todas las líneas, pero sí tengo el número de línea, así que espero que haya alguna forma sencilla de reemplazar esa línea con el nuevo texto.

¿Alguna idea/sugerencia?

Respuesta

11
sed -i yourfile.xml -e '25462599s!</Topic>!</Line>!' 
+0

Eso no funciona si la etiqueta de apertura también está en la misma línea ... –

+0

Buena captura. Fijo. – chaos

+0

Corriendo ahora. ¡Gracias! – GeoffreyF67

7
sed -i '25462599 s|</Topic>|</Line>|' nameoffile.txt 
2

Uso "cabeza" para obtener la primera 25462598 líneas y el uso de "cola" para obtener las líneas restantes (comenzando en 25462601). Aunque ... para un archivo de 2GB, esto tomará un tiempo.

También está seguro de que el problema es solo con esa línea y no en algún lugar anterior (es decir, el error parece un error de análisis XML que podría significar que el problema real es otro).

+0

Las etiquetas de línea son de cierre automático, por lo que el adicional debe iniciarse en otro lugar ... –

+0

Eso me hizo ver y en realidad era ExternalPage que necesitaba reemplazar. ¡Gracias! – GeoffreyF67

5

La herramienta para la edición de texto archivos en Unix, se llama ed (en contraposición a sed, que como su nombre lo indica es un editor de flujo ).

ed una vez fue pensado como un editor interactivo, pero también puede ser fácilmente guionado. La forma en que funciona ed, es que todos los comandos toman un parámetro de dirección. La forma de abordar una línea específica es solo el número de línea, y la forma de cambiar las líneas direccionadas es el comando s, que toma la misma expresión regular que sed. Entonces, para cambiar la línea 42, escribiría algo como 42s/old/new/.

Aquí es todo el comando:

FILENAME=/path/to/whereever 
LINENUMBER=25462599 

ed -- "${FILENAME}" <<-HERE 
    ${LINENUMBER}s!</Topic>!</Line>! 
    w 
    q 
HERE 

La ventaja de esto es que ed es estándar, mientras que la bandera -i a sed es una extensión de GNU propietario que no está disponible en una gran cantidad de sistemas.

1

Mi script de shell:

#!/bin/bash 
awk -v line=$1 -v new_content="$2" '{ 
     if (NR == line) { 
       print new_content; 
     } else { 
       print $0; 
     } 
}' $3 

Argumentos:

first: line number you want change 
second: text you want instead original line contents 
third: file name 

Esta salida impresiones de guión a la salida estándar, entonces usted necesita para redirigir. Ejemplo:

./script.sh 5 "New fifth line text!" file.txt 

Puede mejorarlo, por ejemplo, teniendo cuidado de que todos sus argumentos tengan los valores esperados.

Cuestiones relacionadas