我有很多格式的文件路径:
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
的值。我怎么能这样做?
答案 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
将在找到时执行每个分配,在这种情况下,动态创建变量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"