假设我有一些具有非常具体的命名方案的文件。例如,也许我有一个名为 的文件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
注意:答案适用于bash
shell,并假设文件名中没有特殊字符,例如空格。
假设$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"