2017-12-21 13 views
2

Ich möchte die 4 Zeichen vor dem letzten Zeichen entfernen.4 Zeichen vor dem letzten Zeichen mit sed (oder awk) entfernen

Eingang:

abc2a982 
e1kei9e5bc5 
e1edeaww58476 

Erwartete Ausgabe:

abc2 
e1kei95 
e1edeaww6 

Ich habe bisher versucht:

cat file | while read line; do echo $line | sed 's/.\{4}$\1/';done 

Ich denke, es etwas anderes stattsein sollte.

+0

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) –

Antwort

4
% cat input | sed 's/....\(.\)$/\1/' 
abc2 
e1kei95 
e1edeaww6 
+0

LOL, außer "cat input" ist ein Platzhalter für eine viel kompliziertere Pipeline. –

+0

Eigentlich habe ich diese Lösung versucht, aber mein Fehler war, dass ich '\\ (. \\)' für alle '.' aber das erste. – achille

+0

@achille - das war nicht in Ihrer Frage enthalten, aber es sollte immer noch funktionieren. Sie können einfach die Ausdrücke in Klammern zählen und den Wert auswählen, den Sie in die Ersetzungszeichenfolge einfügen möchten. 's/.... \ (. \) $/\ 1/'' ist funktional äquivalent zu' 's/\ (. \) \ (. \) \ (. \) \ (. \) \ (. \) $/\ 5/''. – ghoti

0

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.

+0

Bash 4.3 oder neuer kann 'printf'% s% s \ n '"$ {zeile: 0: -5}" "$ {line: (- 1)}" '. –

+0

Schön. Dank dafür. :) – ghoti

Verwandte Themen