Je souhaite supprimer Control Return, fusionner des lignes dans un fichier texte et limiter le nombre de caractères
input.txt contenant:
comment 1
comment 2
...
comment n
output.txt faut-il chaine:
comment 1 comment 2 ... commnet n
MAIS le ouput.txt doit être limité à 32 caractères:
comment 1 comment 2 comment 3 co
Puis-je utiliser sed, awk tr ou quelque chose d'autre?
head -c 32 input.txt | tr '\n' ' ' > output.txt
head -c 32
supprime tous les octets sauf les 32 premiers.
tr '\n' ' '
remplace tous les caractères de nouvelle ligne par des espaces.
Si vous voulez limiter caractères au lieu de octets en cas de codage sur plusieurs octets, vous pouvez utiliser grep
à la place:
tr '\n' ' ' < input.txt | grep -oEe '^.{,32}' > output.txt
Awk ira bien. Une façon est:
$ echo -n "comment 1\rcomment 2\r...\rcomment n\r" > input.txt
$ cat input.txt | awk -v FS="" -v RS="" '{for (i=1;i<=32;i++) printf ($i == "\r")? "" : $i}' > output.txt
$ cat output.txt
comment 1comment 2...comment
Explication: par défaut, awk traite les entrées ligne par ligne, avec une seule ligne appelée record ; chaque ligne traitée colonne par colonne, avec une seule colonne appelée , champ . Chaque champ est référencé par des variables commençant par 1, par exemple. 1 $, 2 $, 3 $…
Vous modifiez donc le comportement par défaut en définissant F ield S eparator sur ""
, ce qui fait que awk traite les commandes caractère par caractère. Ensuite, vous définissez R ecord S eparator sur ""
afin que vous puissiez faire référence aux caractères de tout le texte à la fois (c’est-à-dire sans écrire de code pour gérer les commandes ligne par ligne) .
Enfin, vous pouvez facilement manipuler des caractères, de sorte que vous passez en boucle sur les champs (c'est-à-dire des caractères) et n'imprimez que lorsque le caractère n'est pas un retour à la ligne.
tr '\n' ' ' < in.txt | cut -c -32
tr '\n' ' '
: supprime les nouvelles lignes du texte saisicut -c -32
: limite la sortie à 32 caractères