
我有以下格式的文件:
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