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.