给定someletters_12345_moreleters形式的文件名。ext,我想提取5位数字,并将它们放入一个变量。
为了强调这一点,我有一个x个字符的文件名,然后是一个5位数字序列,两边都有一个下划线,然后是另一组x个字符。我想把这个5位数代入一个变量。
我对实现这一目标的多种不同方式非常感兴趣。
给定someletters_12345_moreleters形式的文件名。ext,我想提取5位数字,并将它们放入一个变量。
为了强调这一点,我有一个x个字符的文件名,然后是一个5位数字序列,两边都有一个下划线,然后是另一组x个字符。我想把这个5位数代入一个变量。
我对实现这一目标的多种不同方式非常感兴趣。
当前回答
我的答案将对你想从字符串中得到什么有更多的控制。下面是如何从字符串中提取12345的代码
str="someletters_12345_moreleters.ext"
str=${str#*_}
str=${str%_more*}
echo $str
如果你想提取像abc这样的字符或像_或-这样的特殊字符,这样会更有效。例如:如果你的字符串是这样的,你想要someletters_之后和_moreleters之前的所有内容。ext:
str="someletters_123-45-24a&13b-1_moreleters.ext"
使用我的代码,您可以确切地说出您想要什么。 解释:
#*它将删除前面的字符串,包括匹配的键。这里我们提到的键是_ 它将删除以下字符串,包括匹配的键。这里我们提到的键是_more*
自己做一些实验,你会发现这很有趣。
其他回答
外壳切割-从字符串中打印特定范围的字符或给定部分
#method1)使用bash
str=2020-08-08T07:40:00.000Z
echo ${str:11:8}
#方法2)使用cut
str=2020-08-08T07:40:00.000Z
cut -c12-19 <<< $str
#method3)当使用awk时
str=2020-08-08T07:40:00.000Z
awk '{time=gensub(/.{11}(.{8}).*/,"\\1","g",$1); print time}' <<< $str
也许这可以帮助你得到想要的输出
代码:
your_number=$(echo "someletters_12345_moreleters.ext" | grep -E -o '[0-9]{5}')
echo $your_number
输出:
12345
这里是纯参数替换,一个空字符串。注意,我只将一些字母和更多字母定义为字符。如果它们是字母数字,这将无法正常工作。
filename=someletters_12345_moreletters.ext
substring=${filename//@(+([a-z])_|_+([a-z]).*)}
echo $substring
12345
遵循要求
我有一个文件名,x个字符,然后是5位数字 序列两侧分别用一个下划线包围 x个字符的集合。我想取一个5位数 把它代入一个变量。
我发现了一些可能有用的grep方法:
$ echo "someletters_12345_moreleters.ext" | grep -Eo "[[:digit:]]+"
12345
或更好的
$ echo "someletters_12345_moreleters.ext" | grep -Eo "[[:digit:]]{5}"
12345
然后使用-Po语法:
$ echo "someletters_12345_moreleters.ext" | grep -Po '(?<=_)\d+'
12345
或者如果你想让它正好适合5个字符:
$ echo "someletters_12345_moreleters.ext" | grep -Po '(?<=_)\d{5}'
12345
最后,要将它存储在一个变量中,只需要使用var=$(命令)语法。
通用解决方案,其中数字可以在文件名中的任何位置,使用这样的序列中的第一个:
number=$(echo $filename | egrep -o '[[:digit:]]{5}' | head -n1)
另一个精确提取变量一部分的解决方案:
number=${filename:offset:length}
如果你的文件名总是使用stuff_digits_…你可以使用awk:
number=$(echo $filename | awk -F _ '{ print $2 }')
还有一种方法可以删除除数字以外的所有内容,使用
number=$(echo $filename | tr -cd '[[:digit:]]')