如何提取“.”之前的文件名部分或在延期之前

如何提取“.”之前的文件名部分或在延期之前

我有以下格式的文件:

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

相关内容