如何提取“.”之前的檔案名稱部分或在延期之前

如何提取“.”之前的檔案名稱部分或在延期之前

我有以下格式的文件:

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)(but-last 欄位) 而不是$4)。

答案2

如果 POSIX shell 變數中有檔名:

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,減去最長匹配模式來自前端

像這樣的參考有關參數擴展的詳細資訊。

如果檔案名稱清單位於文字流上,每行一個檔案名稱:

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

答案3

您可以使用 GNU grep

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

解釋

  • (?<=)是lookbehind,(?<=_)匹配模式之前的底線_
  • \d+匹配一個或多個數字。
  • (?=)是向前看,(?=\.)匹配模式後的點.

整個正規表示式意味著匹配_和之間的所有內容.

答案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

相關內容