0

我正在尝试从遵循特定模式的文件名中提取数字:

file-8923489_something.txt
another_file-8923489_something.txt
some-other_file-8923489_something.txt

我想提取文本“file-”和“_something”之间的数字,它将与上述 3 个文件名一起使用。

解决此问题的最佳方法是什么?

是否可以仅使用 ## 和 %% 等运算符来执行此操作?怎么样:

filename=file-8923489_something.txt
file=${${filename##*file}%%_something}}

然而,它并没有像我预期的那样工作。

4

3 回答 3

2

使用预 BASH 正则表达式:

x="some-other_file-8923489_something.txt"
[[ "$x" =~ file-([0-9]*)_something ]] && echo ${BASH_REMATCH[1]}
8923489

或者这grep -P也将起作用:

grep -oP "file-\K\d+(?=_something)" file
8923489
8923489
8923489

或使用 awk:

awk -F 'file-|_something' '{print $2}' file
8923489
8923489
8923489
于 2013-10-09T08:59:52.693 回答
0

是否可以仅使用运算符来执行此操作,...

$ filename="file-8923489_something.txt"
$ file=${foo//[^0-9]/}
$ echo $file
8923489

您可能需要参考Shell Parameter Expansion

或者,您可以说:

$ file=$(tr -dc '[[:digit:]]' <<< "$filename")
$ echo $file
8923489
于 2013-10-09T09:00:40.227 回答
0

grep

$ echo "file-8923489_something.txt
another_file-8923489_something.txt
some-other_file-8923489_something.txt" | grep -Po '(?<=file-)\d+'
8923489
8923489
8923489

或纯bash

d="your_string"
d1=${d%_*}
your_final_string=${d1##*-}

测试

$ d="file-8923489_something.txt"
$ d1=${d%_*}
$ echo $d1
file-8923489
$ echo ${d1##*-}
8923489

$ d="some-other_file-8923489_something.txt"
$ d1=${d%_*}
$ echo $d1
some-other_file-8923489
$ echo ${d1##*-}
8923489

$ d="another_file-8923489_something.txt"
$ d1=${d%_*}
$ echo $d1
another_file-8923489
$ echo ${d1##*-}
8923489
于 2013-10-09T08:57:06.567 回答