我有以下文件名格式:filename_1234.svg
如何检索以下划线开头并后跟点的数字。在.svg
我试过了:
width=${fileName//[^0-9]/}
但是如果fileName也包含一个数字,它将返回文件名中的所有数字,例如
file6name_1234.svg
我找到了两个下划线的解决方案(并将其拆分为数组),但我正在寻找一种检查下划线和点的方法。
答案 0 :(得分:2)
请尝试以下代码:
filename="filename_6_1234.svg"
if [[ "$filename" =~ ^(.*)_([^.]*)\..*$ ]];
then
echo "${BASH_REMATCH[0]}" #will display 'filename_6_1234.svg'
echo "${BASH_REMATCH[1]}" #will display 'filename_6'
echo "${BASH_REMATCH[2]}" #will display '1234'
fi
说明:
=~
:用于正则表达式比较的bash运算符^(.*)_([^.])\..*$
:我们会查找任何字符,后跟一个下划线,后跟任意字符,后跟一个点和一个扩展名。我们创建了2个捕获组,一个用于最后一个下划线,一个用于后面BASH_REMATCH
:包含已捕获组的数组答案 1 :(得分:1)
更多方式
[akshay@localhost tmp]$ filename=file1b2aname_1234.svg
[akshay@localhost tmp]$ after=${filename##*_}
[akshay@localhost tmp]$ echo ${after//[^0-9]}
1234
使用awk
[akshay@localhost tmp]$ awk -F'[_.]' '{print $2}' <<< "$filename"
1234
答案 2 :(得分:1)
您可以使用简单的参数展开和子字符串删除来简单地从右修剪到包括'.'
,然后修剪< em> left 包括'_'
,包括你想要的数字,例如
$ width=filename_1234.svg; val="${width%.*}"; val="${val##*_}"; echo $val
1234
注意: #
从左到第一次出现进行修剪,而##
修剪到最后-occurrence 。 %
和%%
的工作方式与正确的相同。
说明:
width=filename_1234.svg
- width
保存您的文件名
val="${width%.*}"
- val
持有filename_1234
val="${val##*_}"
- 最后val
成立1234
当然,如果您的意图是val
应保持宽度,则无需使用width
之类的临时值。我只是用temp来防止改变width
的原始内容。如果您想在width
中得到结果数字,只需将val
替换为上面的width
,直接在width
上运行。
注2:使用参数扩展等shell功能可防止创建单独的子shell并生成使用sed
等实用程序时出现的单独进程{ {1}}或grep
(或任何不属于shell的内容)。
答案 3 :(得分:0)
我会用
sed 's!_! !g' | awk '{print "_" $NF}'
从filename_1234.svg到_1234.svg然后
sed 's!svg!!g'
摆脱扩展。
答案 4 :(得分:0)
如果设置IFS
,则可以使用Bash的内置read
。
这会使用下划线和点分隔文件名,并将结果存储在数组a
中。
IFS='_.' read -a a <<<'file1b2aname_1234.svg'
这将从数组中获取倒数第二个元素。
echo ${a[-2]}
答案 5 :(得分:0)
有一个使用cut的解决方案:
name="file6name_1234.svg"
num=$(echo "$name" | cut -d '_' -f 2 | cut -d '.' -f 1)
echo "$num"
-d
用于指定分隔符。
-f
指的是所需的字段。
我对表现一无所知,但理解简单,维护简单。