So extrahieren Sie einen Teil eines Dateinamens vor '.' oder vor der Erweiterung

So extrahieren Sie einen Teil eines Dateinamens vor '.' oder vor der Erweiterung

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 $variableminuskü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

verwandte Informationen