ファイル名の「.」の前または拡張子の前の部分を抽出する方法

ファイル名の「.」の前または拡張子の前の部分を抽出する方法

以下の形式のファイルがあります:

abc_asdfjhdsf_dfksfj_12345678.csv
hjjhk_hkjh_asd_asd_sd_98765498.csv
hgh_nn_25342134.exe

.最後のの前と後の値を取得したいです_

結果は次のようになります。

abc_asdfjhdsf_dfksfj_12345678.csv   ----> 12345678
hjjhk_hkjh_asd_asd_sd_98765498.csv  ----> 98765498
hgh_nn_25342134.exe                 ----> 25342134

答え1

awkも使えます。

$ echo "abc_asdfjhdsf_dfksfj_12345678.csv" | awk -F'[_.]' '{print $4}'
12345678

フィールド区切り文字を または に設定します_.次に、列番号 4 を印刷すると、目的の結果が得られます ($(NF-1)の代わりに (最後のフィールド) を使用することもできます$4)。

答え2

POSIX シェル変数にファイル名がある場合:

file=abc_asdfjhdsf_dfksfj_12345678.csv
n=${file%.*}   # n becomes abc_asdfjhdsf_dfksfj_12345678
n=${file##*_}  # n becomes 12345678.csv

説明によると:

  • ${variable%pattern}$variable、マイナス最短一致するパターンバックエンド;
  • ${variable##pattern}$variable最長一致するパターンフロントエンド

見るこのような参考文献パラメータ拡張の詳細については、こちらをご覧ください。

ファイル名のリストがテキスト ストリーム上にあり、1 行に 1 つのファイル名がある場合:

sed -n 's/.*_\(.*\)\..*/\1/p'

答え3

GNU を使うことができますgrep:

$ echo abc_asdfjhdsf_dfksfj_12345678.csv | grep -oP '(?<=_)\d+(?=\.)'
12345678

説明

  • (?<=)後読み、パターンの前の(?<=_)アンダースコアに一致します_
  • \d+1 つ以上の数字と一致します。
  • (?=)先読みであり、パターンの後の(?=\.)ドットに一致します。.

正規表現全体は、_との間に含まれるすべてのものに一致することを意味します。.

答え4

awkを使っても同じ結果が得られます

awk -F"." '{print $1}' | awk -F"_" '{print $NF}'

あなたの例から

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

関連情報