在文件名中搜索特定字符串并将其保存到 shell 脚本中的变量中

在文件名中搜索特定字符串并将其保存到 shell 脚本中的变量中

假设我有一些具有非常具体的命名方案的文件。例如,也许我有一个名为 的文件x=1,y=15,z=63.txt,并且我已将此文件名保存到变量 中file。我想在变量中搜索字符串"x=",然后将其后的数字保存到变量中x。对于y和 也是如此z

x="search x=*, $file"
y="search y=*, $file"
z="search z=*.txt $file"

作为 shell 脚本新手,这些显然是假命令,并且无法编译,但我希望它概述了我的目标。对于我想做的事情有什么解决方案吗?

答案1

注意:答案适用于bashshell,并假设文件名中没有特殊字符,例如空格。

假设$file变量包含文件名,首先需要删除文件的后缀:

$ file=${file%.*}
$ echo $file
x=1,y=15,z=63

现在$file就只有了x=1,y=15,z=63

现在您可以使用declare内置的bash

declare ${file//,/ }

${file//,/ }会将所有逗号字符替换为空格,因此 bash 会将其扩展为:

declare x=1 y=15 z=63

结果是:

$ declare ${file//,/ }
$ echo $x $y $z
1 15 63

答案2

您可以使用正则表达式和 sed 来提取数字。


$ echo x=1,y=15,z=63  | sed 's/.*x=\([0-9]\+\).*/\1/g'
1
$ echo x=1,y=15,z=63  | sed 's/.*y=\([0-9]\+\).*/\1/g'
15
$ echo x=1,y=15,z=63  | sed 's/.*z=\([0-9]\+\).*/\1/g'
63

答案3

假设值是整数,正则表达式匹配将是提取值的简洁方法。

这是

file='x=1,y=15,z=63.txt'

if [[ $file =~ "x="([0-9]+)",y="([0-9]+)",z="([0-9]+) ]]; then
    x=${BASH_REMATCH[1]}
    y=${BASH_REMATCH[2]}
    z=${BASH_REMATCH[3]}
fi

declare -p x y z

输出

declare -- x="1"
declare -- y="15"
declare -- z="63"

相关内容