Bash:如何提取以_开头的数字,然后是

时间:2017-07-25 07:26:53

标签: string bash extract

我有以下文件名格式:filename_1234.svg

如何检索以下划线开头并后跟点的数字。在.svg

之前可以有一到四个数字

我试过了:

width=${fileName//[^0-9]/}

但是如果fileName也包含一个数字,它将返回文件名中的所有数字,例如

file6name_1234.svg

我找到了两个下划线的解决方案(并将其拆分为数组),但我正在寻找一种检查下划线和点的方法。

6 个答案:

答案 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指的是所需的字段。

我对表现一无所知,但理解简单,维护简单。