2009-03-31 16 views
5

Ho un file di testo da 2 GB sulla mia macchina Linux che sto cercando di importare nel mio database.Come posso sostituire una linea specifica per numero di riga in un file di testo?

Il problema che sto avendo è che lo script che sta elaborando il file RDF sta soffocando in una riga:

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

Voglio sostituire la </Topic> con </Line>. Non riesco a fare una ricerca/sostituzione su tutte le righe, ma ho il numero di riga, quindi spero che ci sia un modo semplice per sostituire quella riga con il nuovo testo.

Qualche idea/suggerimento?

risposta

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

Questo non funziona se il tag di apertura è anche sulla stessa linea ... –

+0

Buona cattura. Fisso. – chaos

+0

Eseguendolo ora. Grazie! – GeoffreyF67

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

Uso "testa" per ottenere le prime 25462598 righe e utilizzare "coda" per ottenere le linee rimanenti (iniziando a 25.462.601). Anche se ... per un file da 2 GB questo richiederà un po 'di tempo.

Inoltre sei sicuro che il problema sia solo con quella linea e non da qualche parte in precedenza (cioè l'errore sembra un errore di analisi XML che potrebbe significare che il problema reale è altrove).

+0

I tag di riga si chiudono automaticamente, quindi l'ulteriore deve essere avviato da qualche altra parte ... –

+0

Questo mi ha fatto sembrare ed era in realtà ExternalPage che dovevo sostituire. Grazie! – GeoffreyF67

5

Lo strumento per la modifica del testo file in Unix, è chiamato ed (al contrario di sed, che come dice il nome è un editor di flusso).

ed una volta era inteso come un editor interattivo, ma può anche essere facilmente copiato. Il modo in cui funziona ed è che tutti i comandi accettano un parametro di indirizzo. Il modo per indirizzare una linea specifica è solo il numero di riga, e il modo per cambiare la linea (e) indirizzata/e è il comando s, che prende la stessa espressione regolare che sarebbe sed. Quindi, per cambiare la quarantaduesima riga, scriverebbe qualcosa come 42s/old/new/.

Ecco l'intero comando:

FILENAME=/path/to/whereever 
LINENUMBER=25462599 

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

Il vantaggio di questo è che ed è standardizzato, mentre la bandiera a -ised è un'estensione proprietaria GNU che non è disponibile su molti sistemi.

1

mio script di shell:

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

Argomenti:

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

Questa uscita stampe di script su stdout allora avete bisogno di reindirizzare. Esempio:

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

È possibile migliorarlo, ad esempio, facendo attenzione che tutti gli argomenti abbiano valori previsti.

Problemi correlati