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,而不是一个特性)。