String 提取文件名中的属性值?
我有许多格式的文件路径:String 提取文件名中的属性值?,string,bash,String,Bash,我有许多格式的文件路径: dir1/someotherdir/name_q=3_a=2.34_p=1.2.ext 我正在运行一个bash脚本来对这些文件进行一些处理,我需要从每个路径中提取p(在本例中为1.2;通常为浮点数)的值。基本上,我在所有文件路径上运行for循环,对于每个路径,我需要提取p的值。如何执行此操作?是此类操作的有用工具: #!/bin/bash # ^^^^ IMPORTANT: Not /bin/sh f=dir1/someotherdir/name_q=3_
dir1/someotherdir/name_q=3_a=2.34_p=1.2.ext
我正在运行一个bash脚本来对这些文件进行一些处理,我需要从每个路径中提取p
(在本例中为1.2;通常为浮点数)的值。基本上,我在所有文件路径上运行for
循环,对于每个路径,我需要提取p
的值。如何执行此操作?是此类操作的有用工具:
#!/bin/bash
# ^^^^ IMPORTANT: Not /bin/sh
f=dir1/someotherdir/name_q=3_a=2.34_p=1.2.ext
if [[ $f = *_p=* ]]; then # Check for substring in filename
val=${f##*_p=} # Trim everything before the last "_p="
val=${val%%_*} # Trim everything after first subsequent _
val=${val%.ext} # Trim extension, should it exist.
echo "Extracted $val from filename $f"
fi
或者,您也可以使用shell本机正则表达式支持:
#!/bin/bash
# ^^^^ again, NOT /bin/sh
f=dir1/someotherdir/name_q=3_a=2.34_p=1.2.ext
# assigning regex to a variable avoids surprising behavior with some older bash releases
p_re='_p=([[:digit:].]+)(_|[.]ext$)'
if [[ $f =~ $p_re ]]; then # evaluate regex
echo "Extracted ${BASH_REMATCH[1]}" # extract groups from BASH_REMATCH array
fi
是此类操作的有用工具:
#!/bin/bash
# ^^^^ IMPORTANT: Not /bin/sh
f=dir1/someotherdir/name_q=3_a=2.34_p=1.2.ext
if [[ $f = *_p=* ]]; then # Check for substring in filename
val=${f##*_p=} # Trim everything before the last "_p="
val=${val%%_*} # Trim everything after first subsequent _
val=${val%.ext} # Trim extension, should it exist.
echo "Extracted $val from filename $f"
fi
或者,您也可以使用shell本机正则表达式支持:
#!/bin/bash
# ^^^^ again, NOT /bin/sh
f=dir1/someotherdir/name_q=3_a=2.34_p=1.2.ext
# assigning regex to a variable avoids surprising behavior with some older bash releases
p_re='_p=([[:digit:].]+)(_|[.]ext$)'
if [[ $f =~ $p_re ]]; then # evaluate regex
echo "Extracted ${BASH_REMATCH[1]}" # extract groups from BASH_REMATCH array
fi
为了完整性,另一种方法是使用
eval
。这里可能存在安全隐患,如果这些都是合理的,你必须自己决定
我正在使用IFS
进行拆分-不是每个人都喜欢,但这是另一种方式。eval
将按其找到的方式执行每个赋值,在这种情况下,动态创建变量q
、a
和p
fname='dir1/someotherdir/name_q=3_a=2.34_p=1.2.ext'
OldIFS="$IFS"
IFS='_'
for val in $fname
do
if [[ $val == *=* ]]
then
val=${val%.ext}
eval "$val"
fi
done
IFS="$OldIFS"
echo "$q"
echo "$a"
echo "$p"
为了完整性,另一种方法是使用
eval
。这里可能存在安全隐患,如果这些都是合理的,你必须自己决定
我正在使用IFS
进行拆分-不是每个人都喜欢,但这是另一种方式。eval
将按其找到的方式执行每个赋值,在这种情况下,动态创建变量q
、a
和p
fname='dir1/someotherdir/name_q=3_a=2.34_p=1.2.ext'
OldIFS="$IFS"
IFS='_'
for val in $fname
do
if [[ $val == *=* ]]
then
val=${val%.ext}
eval "$val"
fi
done
IFS="$OldIFS"
echo "$q"
echo "$a"
echo "$p"
eval
向该代码添加了什么值?你能用它做些什么,没有它你就做不到同样好的事情呢?(另一个很明显的例子,就是执行嵌入在文件名中的代码——但是我把荣誉name\u evil=$(rm-rf~)
称为一个bug而不是一个特性。)eval
给这段代码增加了什么价值?你能用它做些什么,没有它你就做不到同样好的事情呢?(另一个很明显的现象是,执行嵌入在文件名中的代码——但我认为荣誉name\u evil=$(rm-rf~)
是一个bug,而不是一个特性)。