Wenn Sie den Drang hat dies allein mit bash zu tun, und zu vermeiden, mit sed, könnten Sie parameter expansion benutzen, um Ihre Strings zu manipulieren.
while read -r line; do
allbutlast1="${line%?}" # strip the last character from $line
lastchar="${line#$allbutlast1}" # strip what we just captured from start of line
allbutlast5="${line%?????}" # strip the last 5 characters
printf '%s%s\n' "$allbutlast5" "$lastchar"
done
Oder wenn Sie bash als Shell verwenden, haben Sie additional options:
while read -r line; do
printf '%s%s\n' "${line:0:$((${#line} - 5))}" "${line:$((${#line} - 1))}"
done
(bash-Code auf Wegwerf-Variablen speichern verdichtet.)
Die POSIX Code (erstes Beispiel) verwendet die Parametererweiterungen ${var%...}
und ${var#...}
, um den Ausgang zu konstruieren. Der Bash-Code verwendet ${var:start:length}
Notation mit arithmetic expansion, $((...))
.
Diese Antwort ist meistens für akademische Zwecke enthalten. Mit awk oder sed erhalten Sie eine bessere Leistung als die Eingabe Zeile für Zeile mit einem Shell-Skript.
Apropos, eine Lösung, die die awk bash Lösung widerspiegeln könnte:
awk '{print substr($0,1,length($0)-5) substr($0,length($0))}'
anzumerken, dass, während die Schreibweise ${var:start:length}
bash beginnt bei einem Zeichen auf Null, awk des substr()
Funktion beginnt die Nummerierung.
Mögliches Duplikat von [Wie kann ich die ersten X-Zeichen aus der Zeichenfolge mit sed entfernen?] (Https://stackoverflow.com/questions/11469989/how-can-i-strip-first-x-characters-from-string -using-sed) –