2009-12-16 3 views
2

J'ai une virgule flottante à la fin d'un fichier que je voudrais remplacer par un crochet fermant. Il se peut qu'il y ait ou non un caractère de retour à la ligne à la fin du fichier. Comment puis-je remplacer le ou les deux caractères avec le crochet à l'aide d'outils Unix communs?Comment remplacer le dernier ou les deux derniers caractères d'un fichier avec des outils Unix

+0

Contenu du fichier ou nom de fichier? –

+0

Contenu du fichier ... désolé pour ce Jonathan. Je n'ai pas vu ta question là-bas. –

Répondre

2

Cela supprimera toutes les lignes vides de fuite, puis remplacer la dernière virgule dans le fichier avec un « ] »

cat origfile | sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' | sed -e '$s/,$/]/' > outputfile 
+0

Brian, merci pour celui-ci. Je ne me suis pas rendu compte avant d'essayer que les suggestions ci-dessus remplacent toutes les virgules par des fermetures fermées plutôt. Votre seconde déclaration sed est juste ce que je cherchais. –

+0

Euh, hein? La réponse de Matt est la seule qui pourrait être incorrecte. – ephemient

+0

pas besoin de chat. – ghostdog74

1

Généralement, les fichiers texte doivent se terminer par un saut de ligne.

Une façon de modifier un fichier pour remplacer par des virgules arrière avec le support de près la dernière ligne est:

ed - $file <<'!' 
$s/,$/]/ 
w 
q 
! 

Cela va à la dernière ligne, remplace la virgule finale avec support à proximité, et écrit et sorties. Vous pouvez également, en utilisant sed:

sed '$s/,$/]/' $file > new.$file && 
mv new.$file $file 

Si vous avez GNU sed, il y a une option 'écraser' ('-i', IIRC).

Si vous devez traiter avec des noms de fichiers plutôt que le contenu du fichier, puis:

newname=$(echo "$oldname" | sed 's/,$/]/') 

Et sans doute il y a d'autres mécanismes aussi. Vous pouvez également utiliser Perl ou Python; ils tendent vers l'exagération pour l'exemple demandé.

+0

Je pense que je ne comprends probablement pas le 'sed' correctement. Un saut de ligne ne ferait-il pas sauter le $ à la ligne vide, sur lequel il ne trouverait pas de virgule et sortirait rapidement? – jdmichal

+1

Non, '$' signifie "dernière ligne". La dernière ligne peut se terminer par \ n (ce qui est généralement le cas sous UNIX); ce sera toujours la dernière ligne. – ephemient

2

Sed peut facilement faire remplacer à la dernière ligne seulement:

 
sed '$ s/,/]/g' inputFile 

Le sélecteur d'adresse $ indique la dernière ligne.

Si le fichier se terminait par un saut de ligne, cela ne changerait rien à cela. Est-ce vraiment un comportement désiré, ou voulez-vous juste remplacer le dernier, avec]?

+0

Merci, c'est exactement ce que je cherchais. Et oui, vous avez raison, je ne me soucie pas vraiment de savoir s'il y a ou non un saut de ligne, je veux juste que la virgule soit remplacée. Merci! –

+4

La commande remplace toutes les virgules de la dernière ligne. Vous devriez utiliser ''$ s /, $ /] /'' si vous voulez seulement remplacer la dernière virgule. – mouviciel

1
perl -i -pe'BEGIN{undef$/}s/,\n?\Z/]/' 
0

est ici une méthode plus rapide par rapport à utiliser sed pour de gros fichiers, en supposant que la dernière ligne n'est pas une nouvelle ligne

head -n -1 file > temp; 
s=$(tail -1 file) 
echo ${s/%,/]} >> temp 
echo mv temp file 
Questions connexes