Ich habe Dateien im folgenden Format:
abc_asdfjhdsf_dfksfj_12345678.csv
hjjhk_hkjh_asd_asd_sd_98765498.csv
hgh_nn_25342134.exe
Ich möchte den Wert vor .
und nach dem letzten erhalten _
.
Das Ergebnis würde wie folgt aussehen:
abc_asdfjhdsf_dfksfj_12345678.csv ----> 12345678
hjjhk_hkjh_asd_asd_sd_98765498.csv ----> 98765498
hgh_nn_25342134.exe ----> 25342134
Antwort1
Sie könnten auch awk verwenden,
$ echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F'[_.]' '{print $4}'
12345678
Es setzt den Feldtrenner auf _
oder .
. Wenn Sie dann die Spalte mit der Nummer 4 drucken, erhalten Sie das gewünschte Ergebnis (Sie können auch $(NF-1)
(das vorletzte Feld) anstelle von bevorzugen $4
).
Antwort2
Wenn Sie den Dateinamen in einer POSIX-Shell-Variable haben:
file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*} # n becomes abc_asdfjhdsf_dfksfj_12345678
n=${file##*_} # n becomes 12345678.csv
Zur Erklärung:
${variable%pattern}
ist wie$variable
minuskürzestepassendes Muster aus demBackend;${variable##pattern}
ist wie$variable
, abzüglich deram längstenpassendes Muster vonFrontend.
Seheneine Referenz wie diesefür weitere Informationen zur Parametererweiterung.
Wenn sich die Liste der Dateinamen in einem Textstream mit einem Dateinamen pro Zeile befindet:
sed -n 's/.*_\(.*\)\..*/\1/p'
Antwort3
Sie können GNU verwenden grep
:
$ echo abc_asdfjhdsf_dfksfj_12345678.csv | grep -oP '(?<=_)\d+(?=\.)'
12345678
Erläuterung
(?<=)
ist ein Lookbehind,(?<=_)
entspricht einem Unterstrich_
vor dem Muster.\d+
stimmt mit einer oder mehreren Zahlen überein.(?=)
ist ein Vorausschauverfahren, das(?=\.)
einem Punkt.
nach einem Muster entspricht.
Der gesamte reguläre Ausdruck bedeutet, dass alle Dinge zwischen _
und übereinstimmen..
Antwort4
Sie können dasselbe mit awk erreichen
awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
aus deinem Beispiel
echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
12345678
echo "hjjhk_hkjh_asd_asd_sd_98765498.csv" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
98765498
echo "hgh_nn_25342134.exe" | awk -F"." '{print $1}' | awk -F"_" '{print $NF}'
25342134