获取solaris上子字符串的索引

时间:2009-08-05 18:13:27

标签: regex bash solaris

如何找到与solaris10上的正则表达式匹配的子字符串的索引?

4 个答案:

答案 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