Ich verwende ein Mac-Terminal (Bash) und habe eine Datei mit dem Namen , die folgende Zeilen data_list.txt
enthält :n
aaabbbccc_7777.txt
nnhhaa_8888.txt
ayquabay_9999.txt
ayqynbnbn_1122.txt
ooppaa_3454.txt
Wie kann ich die letzten 8 Zeichen jeder Zeile entfernen?
Erwartete Ausgabe von data_list.txt
:
aaabbbccc_
nnhhaa_
ayquabay_
ayqynbnbn_
ooppaa_
Vielen Dank für jede Hilfe
Antwort1
Wenn Sie die letzten 8 Zeichen oder alle (wenn es weniger als 8 sind) löschen möchten, können Sie Folgendes tun:
sed "s/.\{0,8\}$//; /^$/d" data_list.txt
Erweiterte reguläre Ausdrücke sind nicht erforderlich. Dadurch werden so viele Zeichen wie möglich gelöscht, jedoch nicht mehr als 8. Wenn eine leere Zeile übrig bleibt, wird sie aus der Ausgabe entfernt.
Wenn Sie nachstehende Leerzeichen löschen müssen (ohne sie in die 8 Zeichen einzuschließen), können Sie Folgendes tun:
sed "s/.\{0,8\}[[:space:]]*$//" data_list.txt
Ich kann nur raten, was die tatsächliche Bedingung dafür ist, was am Ende entfernt werden soll (z. B. alles nach dem Unterstrich oder eine Zahl + die Erweiterung), aber wenn Sie die Dateierweiterung und alle Ziffern davor entfernen möchten:
sed "s/[[:digit:]]*\..*$//" data_list.txt
In anderen Antworten wurde bereits gezeigt, wie alles nach dem Unterstrich entfernt wird. Daher werde ich das nicht wiederholen.
Antwort2
Für Ihre genaue Eingabe (alle Zeilen haben am Ende Leerzeichen, außer der letzten Zeile) können Sie Folgendes verwenden (ich nehme an, Sie möchten den „after _ part“ loswerden):
sed 's/........ *$//' data_list.txt
Um alles nach dem letzten Unterstrich zu entfernen, verwenden Sie Folgendes:
sed 's/\(.*_\).*$/\1/' data_list.txt
Es funktioniert auch bei Zeilen mit mehreren Unterstrichen, da sed „gierig“ ist. Obwohl ich nicht weiß, ob dies unter MacOS funktioniert, ist es zumindest für Linux-Sed-Benutzer nützlich, dass die Google-Suchmaschine hier landet ...
Antwort3
Hier ist eine awk
Lösung, die genauso schnell ist wie Frippes sed
Ansatz, anhand einer Beispieldatei mit 100.000 Zeilen:
time awk '{print substr($0, 1, length($0)-8)}' 100k.txt
real 0m4.110s
user 0m0.142s
sys 0m0.422s
time sed "s/.\{0,8\}$//; /^$/d" 100k.txt
real 0m4.043s
user 0m1.558s
sys 0m0.345s
Durch eine beliebige Zahl ersetzen 8
. Der Hauptunterschied besteht darin, dass awk
eine neue Zeile gedruckt wird, wenn Ihre Schnittlänge die Zeilenlänge überschreitet, während sed
dies nicht der Fall ist.
Antwort4
Verwenden von Raku (früher bekannt als Perl_6)
raku -ne '.trim-trailing.chop(8).put;'
ODER
raku -pe '.=trim-trailing; .=chop(8);'
Beispieleingabe:
wxxyyyzzzz_1234.txt
aaabbbccc_7777.txt
nnhhaa_8888.txt
ayquabay_9999.txt
ayqynbnbn_1122.txt
ooppaa_3454.txt
Beispielausgabe:
wxxyyyzzzz_
aaabbbccc_
nnhhaa_
ayquabay_
ayqynbnbn_
ooppaa_
Beachten Sie, dass beide Antworten oben Rakus trim-trailing
Routine verwenden, um nachstehende Leerzeichen zu entfernen. Sie können die Anzahl der Zeichen vom rechten Ende der Zeichenfolge löschen trim-trailing
und/oder anpassen .chop