提取文件名中的属性值?

时间:2016-01-20 01:37:04

标签: string bash

我有很多格式的文件路径:

SQL Error: SQLCODE=-551, SQLSTATE=42501, SQLERRMC=IPASS;ALTER TABLE;FOLDET, DRIVER=3.63.75
                   ^^^^                           ^^^   ^^^^^^^^^^    ^^^
                error code                       user   privilege    table 

我正在运行一个bash脚本来对这些文件进行一些处理,我需要从这些路径中提取dir1/someotherdir/name_q=3_a=2.34_p=1.2.ext 的值(在这种情况下为1.2;通常它是一个浮点数)。基本上我在所有文件路径上运行p循环,对于每个路径,我需要提取for的值。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

Parameter expansion是进行此类操作的有用工具:

#!/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-native regex支持:

#!/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

答案 1 :(得分:1)

为完整起见,另一种方法是使用eval。这里可能存在安全隐患,如果这些都是合理的,你必须自己动手。

我正在使用IFS进行拆分 - 并非每个人都喜欢,但这是另一种方式。 eval将在找到时执行每个分配,在这种情况下,动态创建变量qap

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"