如何找到与solaris10上的正则表达式匹配的子字符串的索引?
答案 0 :(得分:2)
假设您想要的是使用bash在字符串中查找通配符的第一个匹配位置,以下bash函数将返回该值,如果通配符不匹配则为空:
function match_index() { local pattern=$1 local string=$2 local result=${string/${pattern}*/} [ ${#result} = ${#string} ] || echo ${#result} }
例如:
$ echo $(match_index "a[0-9][0-9]" "This is a a123 test") 10
如果你想允许完整的正则表达式而不只是通配符,请用“
”替换“local result =”行local result=$(echo "$string" | sed 's/'"$pattern"'.*$//')
然后你接触到通常的shell引用问题。
答案 1 :(得分:1)
我的goto选项是bash,awk和perl。我不确定你要做什么,但三者中的任何一个都可能运作良好。例如:
f=somestring
string=$(expr match "$f" '.*\(expression\).*')
echo $string
答案 2 :(得分:1)
您将问题标记为bash,因此我假设您在bash脚本中询问如何执行此操作。不幸的是,内置的正则表达式匹配不保存字符串索引。但是,如果你要问这个以便提取匹配子字符串,那么你很幸运:
if [[ "$var" =~ "$regex" ]]; then
n=${#BASH_REMATCH[*]}
while [[ $i -lt $n ]]
do
echo "capture[$i]: ${BASH_REMATCH[$i]}"
let i++
done
fi
此代码段将依次输出所有子匹配。第一个(索引0)将是整个匹配。
但您可能更喜欢awk
个选项。有一个函数match
,它为您提供所需的索引。可以找到文档here。如果需要,它还会在RLENGTH
中存储匹配的长度。要在bash脚本中实现此功能,您可以执行以下操作:
match_index=$(echo "$var_to_search" | \
awk '{
where = match($0, '"$regex_to_find"')
if (where)
print where
else
print -1
}')
有很多方法可以处理将变量传递给awk。管道输出的这种组合和直接嵌入awk单线程的组合是相当普遍的。您还可以使用-v
选项提供awk变量值(请参阅man awk
)。
显然你可以修改它来获得长度,匹配字符串,无论你需要什么。如有必要,您可以将多个内容捕获到数组变量中:
match_data=($( ... awk '{ ... print where,RLENGTH,match_string ... }'))
答案 3 :(得分:0)
如果您使用bash 4.x,您可以获取oobash。用bo语言编写的字符串lib,带有oo-style:
http://sourceforge.net/projects/oobash/
String是构造函数:
字符串a abcda
a.indexOf a
0
a.lastIndexOf a
4
a.indexOf da
3
在脚本中使用字符串有很多“方法”:
-base64Decode -base64Encode -capitalize -center
-charAt -concat -contains -count
-endsWith -equals -equalsIgnoreCase -reverse
-hashCode -indexOf -isAlnum -isAlpha
-isAscii -isDigit -isEmpty -isHexDigit
-isLowerCase -isSpace -isPrintable -isUpperCase
-isVisible -lastIndexOf -length -matches
-replaceAll -replaceFirst -startsWith -substring
-swapCase -toLowerCase -toString -toUpperCase
-trim -zfill