10
votes

UNIX: remplacer la nouvelle ligne avec / côlon, préservant la nouvelle ligne avant EOF

J'ai un fichier texte ("INPUT.TXT") du format: xxx

que j'ai besoin de reformater à: xxx < P> Je sais que vous pouvez le faire avec 'SED'. Il y a un milliard de hits Google pour le faire avec 'SED'. Mais j'essaie de mettre l'accent sur la lisibilité, la simplicité et l'utilisation de l'outil correct pour le bon travail. 'Sed' est un éditeur de ligne qui consomme et cache des nouvelles lignes. Probablement pas le bon outil pour ce travail!

Je pense que l'outil correct pour ce travail serait "TR". Je peux remplacer toutes les nouvelles lignes avec des colons avec la commande: xxx

Il y a 99% de mon travail effectué. J'ai un problème, maintenant, cependant. En remplaçant toutes les nouvelles lignes avec des colons, je ne reçois pas seulement un point de côlon étranger à la fin de la séquence, mais je perds également le retour du chariot à la fin de l'entrée. Il ressemble à ceci: xxx

maintenant, j'ai besoin de retirer le côlon de la fin de l'entrée. Toutefois, si j'essaie de transmettre cette entrée traitée via "SED" pour éliminer le dernier côlon (qui serait maintenant, je pense être une utilisation appropriée de "SED"), je me trouve avec un deuxième problème. L'entrée n'est plus terminée par une nouvelle ligne du tout! "SED" échoue, pour toutes les commandes, car il ne trouve jamais la fin de la première ligne d'entrée!

Il semble que l'Ajout d'une nouvelle ligne à la fin de certaines contributions est une tâche très, très courante, et envisageant que je me faisais moi-même était profondément tenté d'écrire un programme pour le faire en C (qui prendrait environ huit lignes de code), je ne peux pas imaginer qu'il n'y a pas déjà un moyen très simple de le faire avec les outils déjà disponibles pour vous dans le noyau Linux.


0 commentaires

3 Réponses :


18
votes

Ceci devrait faire le travail ( cat code> et echo code> est inutile): xxx pré>

en utilisant uniquement SED code >:: p> xxx pré>

bash sans aucun extternal: p> xxx pré>

à l'aide d'une boucle dans sh code>: p> xxx pré>

en utilisant awk: p> xxx pré>

ou: p> xxx pré>

edit: strong> p>

Voici un autre moyen de PURE BASH: P>

echo "$(tr '\n' ':' < INPUT.TXT | head -c -1)"


2 commentaires

J'étais au début déconcerté pourquoi vous posteriez comme une solution la chose exacte que j'ai dit ne fonctionnait pas, alors je l'ai essayé sur une autre machine. J'ai alors compris que le serveur Sun que j'avais besoin de la solution sur n'utilisait pas GNU 'SED'. La version de 'Sed' sur le serveur échoue lorsque l'entrée n'a aucune ligne de terminaison, par conséquent, comme indiqué, pourquoi j'ai utilisé "Echo". (((Le serveur est un dispositif essentiel de mission au travail qui n'a jamais échoué et n'a donc jamais été redémarré, encore moins mis à jour, les années. Bienvenue dans ma vie.) La solution de boucle de coquille est géniale, cependant.


/ bin / sed sur le soleil ... Ick. Que diriez-vous / usr / xpg4 / bin / sed?



1
votes

Voici encore une autre solution: (suppose un ensemble de caractères où ':' est octal 72, par exemple ASCII)

perl -l72 -pe '$\="\n" if eof' INPUT.TXT


0 commentaires

2
votes

ancienne question, mais xxx


0 commentaires