Comment supprimer le retour à la ligne final d'un fichier

Comment supprimer le retour à la ligne final d'un fichier - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 13-09-2012 à 15:28:56    

Bonjour,
 
je cherche à compléter un fichier depuis un script avec un contrainte : parfois l'ajout se fait sur une nouvelle ligne, mais il est aussi possible de devoir ajouter à la fin de la dernière ligne.
 
Pas de soucis en court de script pour remplir des nouvelles lignes par morceaux donc revenir à la ligne quand c'est nécessaire ou compléter la ligne sinon.
 
Mais lorsque le script reprend un fichier ancien, celui-ci possède souvent un retour chariot à la fin ; or tous les moyens disponibles ne permettent pas de supprimer ce caractère pour ajouter un texte en fin de ligne. Idem pour les autres commandes comme sed ou akw qui soient permettent d'enlever la fin de ligne ailleurs qu'en fin de fichier, soit ne permettent pas d'identifier la dernière ligne.
 
 
Bref : peut-on "simplement" retirer ce fichu caractère ?
 
 
Quelques précisions :
- l'édition sous vi ajouter ce caractère, ça peut servir pour tester.
- sed permet de reconnaître la dernière ligne et supprimer le caractère de fin comme

Citation :

sed -i '$!N;s/\n//' conversion.log


le montre, mais dés que le ! ou le !N est supprimé, plus aucun effet !
- essayons awk puisque printf n'envoi pas \n

Citation :

awk '{print};END {printf $0}' conversion.log


supprime bien le \n final au prix d'un doublement de la dernière ligne !
peut-être qu'avec une variable ?

Citation :

awk '{t=t"\n"$0};END {printf t}' conversion.log


en effet plus de \n final ... qui se retrouve en tête
- alors une combinaison

Citation :

awk '{t=t"\n"$0};END {printf t}' conversion.log |sed  '/^$/d'


semble atteindre le résultat, sauf qu'il ne peut modifier le fichier d'origine puisqu'il faudrait rediriger la sortie sur le fichier d'entrée ce qu'il l'efface immédiatemennt
- finalement

Citation :

awk '{t=t"\n"$0};END {printf t}' conversion.log |sed  '/^$/d' > conversion.log_; mv conversion.log_ conversion.log


donne le résultat escompté au prix d'une longue commande et de la création d'un fichier temporaire.
 
 
N'y a-t-il pas plus simple ? Une option de echo, un motif de awk, les deux pour sed ou une simple commande qui permette cela ?
 
Merci.

Reply

Marsh Posté le 13-09-2012 à 15:28:56   

Reply

Marsh Posté le 13-09-2012 à 16:33:43    

salut,
 

Code :
  1. awk '{a[++n]=$0}END{for(i=1;i<n;i++)print a[i]; printf a[i]}' ./fichier


Message édité par Profil supprimé le 13-09-2012 à 16:34:28
Reply

Marsh Posté le 13-09-2012 à 19:16:49    

Merci watael. Effectivement passer par un tableau simplifie un peu.
 
Mais n'existe-t-il pas un moyen plus simple avec une commande comme sed ou même awk pour agir sur la dernière ligne ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed