Dies kann tatsächlich in Bash durchgeführt werden, ohne externe Programme zu verwenden (Skripte, die dies verwenden, müssen mit #!/bin/bash
beginnen statt #!/bin/sh
und ist nicht POSIX-Shell-kompatibel) mit dem Ausdruck ${VARIABLE:offset:length}
(wobei :length
ist optional):
#!/bin/bash
STR="123456789"
echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}
wird diese Ausgabe haben:
1
12345
123456789
6789
9
Beachten Sie, dass der Start-Offset bei null beginnt und die Länge mindestens eins sein muss. Sie können auch einen Offset von der rechten Seite der Zeichenfolge verwenden, indem Sie einen negativen Offset in Klammern verwenden:
echo ${STR:(-5):4}
5678
Um eine Datei zu lesen, rufen Sie die ersten 8 Zeichen wiederholt für jede Zeile ab und geben Sie sie an das Terminal aus, verwenden Sie einen while
Schleife wie folgt:
while read LINE
do echo "${STD:0:8}"
done < "/path/to/the/text_file"
Eine äußerst nützliche Quelle für alles, was Sie über die Manipulation von Bash-Strings wissen müssen, finden Sie hier:https://tldp.org/LDP/abs/html/string-manipulation.html
Mit cut
:
$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001
Wenn ich die zweite Anforderung verstehe, möchten Sie die ersten 22 Zeichen in zwei Spalten der Länge 10 und 12 aufteilen. sed
ist dafür die beste Wahl:
$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001
sudo_O hat eine nette Schnitt- und Sed-Lösung bereitgestellt, ich habe gerade einen awk-Einzeiler hinzugefügt:
awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file
echo "000000000001199998000180000 DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001
mit leerem Zeichen (es hängt von Ihren Anforderungen ab, Sie möchten die Leerzeichen überspringen oder Sie möchten sie in Ihre Ausgabe aufnehmen und zählen)
wenn auch Leerzeichen mitgezählt und ausgegeben werden sollen:(Sie müssen das obige cmd nicht ändern)
echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0 0 0 0 00000001199998
wenn Sie diese Leerzeichen überspringen möchten:(quick and dirty)
echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001