Questo può effettivamente essere fatto in Bash senza utilizzare alcun programma esterno (gli script che lo utilizzano devono iniziare con #!/bin/bash
invece di #!/bin/sh
e non sarà compatibile con la shell POSIX) utilizzando l'espressione ${VARIABLE:offset:length}
(dove :length
è facoltativo):
#!/bin/bash
STR="123456789"
echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}
avrà questo output:
1
12345
123456789
6789
9
Si noti che l'offset iniziale inizia da zero e la lunghezza deve essere almeno uno. Puoi anche eseguire l'offset dal lato destro della stringa utilizzando un offset negativo tra parentesi:
echo ${STR:(-5):4}
5678
Per leggere un file, recupera ripetutamente i primi 8 caratteri per ogni riga e stampali sul terminale, usa un while
loop come questo:
while read LINE
do echo "${STD:0:8}"
done < "/path/to/the/text_file"
Una risorsa estremamente utile per tutto ciò che devi sapere sulla manipolazione delle stringhe di Bash è qui:https://tldp.org/LDP/abs/html/string-manipulation.html
Con cut
:
$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001
Se capisco il secondo requisito, vuoi dividere i primi 22 caratteri in due colonne di lunghezza 10 e 12. sed
è la scelta migliore per questo:
$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001
sudo_O ha fornito una bella soluzione cut and sed, ho appena aggiunto una battuta awk:
awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file
echo "000000000001199998000180000 DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001
con carattere vuoto (dipende dalle tue esigenze, vuoi saltare gli spazi o vuoi includerli e contarli nel tuo output)
se gli spazi vuoti devono essere contati e visualizzati anche nell'output:(non è necessario modificare il cmd sopra)
echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0 0 0 0 00000001199998
se vuoi saltare quegli spazi:(veloce e sporco)
echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001