2009-03-31 9 views
5

J'ai un fichier texte de 2 Go sur mon boîtier Linux que j'essaie d'importer dans ma base de données.Comment puis-je remplacer une ligne spécifique par un numéro de ligne dans un fichier texte?

Le problème que je vais avoir est que le script qui est en train de traiter ce fichier rdf obstrue sur une ligne:

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

Je veux remplacer le </Topic> avec </Line>. Je ne peux pas faire de recherche/remplacement sur toutes les lignes mais j'ai le numéro de ligne, donc j'espère qu'il y a un moyen facile de remplacer cette ligne par le nouveau texte.

Des idées/des suggestions?

Répondre

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

Cela ne fonctionne pas si l'étiquette d'ouverture est également sur la même ligne ... –

+0

Bonne prise. Fixé. – chaos

+0

L'exécuter maintenant. Merci! – GeoffreyF67

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

utilisation « tête » pour obtenir la première 25462598 lignes et en utilisant la « queue » pour obtenir les lignes restantes (à partir de 25462601). Bien que ... pour un fichier de 2 Go cela prendra probablement un certain temps.

Etes-vous sûr que le problème est juste avec cette ligne et pas quelque part précédent (par exemple, l'erreur ressemble à une erreur d'analyse XML qui pourrait signifier que le problème réel est ailleurs).

+0

Les étiquettes de ligne sont à fermeture automatique, donc le supplémentaire doit être démarré ailleurs ... –

+0

Cela m'a fait regarder et il était en fait ExternalPage que je devais remplacer. Merci! – GeoffreyF67

5

L'outil pour éditer du texte fichiers sous Unix, est appelé ed (par opposition à sed, qui, comme son nom l'indique est un éditeur de flux ).

ed était autrefois conçu comme un éditeur interactif, mais il peut aussi facilement être scripté. Le fonctionnement de ed est que toutes les commandes prennent un paramètre d'adresse. La façon d'adresser une ligne spécifique est juste le numéro de ligne, et la manière de changer la ou les lignes adressées est la commande s, qui prend la même expression que sed. Donc, pour changer la 42ème ligne, vous écrivez quelque chose comme 42s/old/new/.

est ici toute commande:

FILENAME=/path/to/whereever 
LINENUMBER=25462599 

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

L'avantage est que ed est standardisé, tandis que le drapeau -i à sed est une extension GNU propriétaire qui ne sont pas disponibles sur un grand nombre de systèmes.

1

Mon script shell:

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

Arguments:

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

Ce script imprime STDOUT alors vous devez rediriger. Exemple:

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

Vous pouvez l'améliorer, par exemple, en prenant soin que tous vos arguments ont les valeurs attendues.

Questions connexes