Cela peut en fait être fait dans Bash sans utiliser de programmes externes (les scripts utilisant cela doivent commencer par #!/bin/bash
au lieu de #!/bin/sh
et ne sera pas compatible avec le shell POSIX) en utilisant l'expression ${VARIABLE:offset:length}
(où :length
est facultatif) :
#!/bin/bash
STR="123456789"
echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}
aura cette sortie :
1
12345
123456789
6789
9
Notez que le décalage de départ commence à zéro et que la longueur doit être au moins égale à un. Vous pouvez également décaler à partir du côté droit de la chaîne en utilisant un décalage négatif entre parenthèses :
echo ${STR:(-5):4}
5678
Pour lire un fichier, récupérez les 8 premiers caractères à plusieurs reprises pour chaque ligne et imprimez-les sur le terminal, utilisez un while
boucle comme ceci :
while read LINE
do echo "${STD:0:8}"
done < "/path/to/the/text_file"
Une ressource extrêmement utile pour tout ce que vous devez savoir sur la manipulation de chaînes Bash est ici :https://tldp.org/LDP/abs/html/string-manipulation.html
Avec cut
:
$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001
Si je comprends bien la deuxième exigence, vous souhaitez diviser les 22 premiers caractères en deux colonnes de longueur 10 et 12. sed
est le meilleur choix pour cela :
$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001
sudo_O a fourni une belle solution de coupe et de sed, je viens d'ajouter une ligne awk :
awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file
echo "000000000001199998000180000 DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001
avec un caractère vide (cela dépend de vos besoins, vous souhaitez ignorer les espaces ou vous souhaitez les inclure et les compter dans votre sortie)
si les espaces vides doivent être comptés et affichés également dans la sortie :(vous n'avez pas à modifier la cmd ci-dessus)
echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0 0 0 0 00000001199998
si vous voulez ignorer ces espaces :(rapide et sale)
echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001