Получение индекса подстроки по солярису - PullRequest
1 голос
/ 05 августа 2009

Как мне найти индекс подстроки, которая соответствует регулярному выражению в solaris10?

Ответы [ 4 ]

2 голосов
/ 06 августа 2009

Предполагая, что вам нужно найти местоположение первого совпадения подстановочного знака в строке, используя 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"'.*$//')

но затем вы сталкиваетесь с обычными проблемами цитирования оболочки.

1 голос
/ 05 августа 2009

Вы пометили вопрос как 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, которая дает вам нужный индекс. Документация может быть найдена здесь . Он также будет хранить длину совпадения в RLENGTH, если вам это нужно. Чтобы реализовать это в скрипте bash, вы можете сделать что-то вроде:

match_index=$(echo "$var_to_search" | \
awk '{
    where = match($0, '"$regex_to_find"')
    if (where)
        print where
    else
        print -1
}')

Есть много способов справиться с передачей переменных в awk. Такая комбинация вывода по трубопроводу и непосредственного встраивания в однострочник awk довольно распространена. Вы также можете задать значения переменных awk с помощью опции -v (см. man awk).

Очевидно, вы можете изменить это, чтобы получить длину, строку соответствия, что бы вам ни понадобилось. При необходимости вы можете записать несколько вещей в переменную массива:

match_data=($( ... awk '{ ... print where,RLENGTH,match_string ... }'))
1 голос
/ 05 августа 2009

Варианты перехода для меня: bash, awk и perl. Я не уверен, что вы пытаетесь сделать, но любой из этих трех вариантов, вероятно, будет работать хорошо. Например:

f=somestring
string=$(expr match "$f" '.*\(expression\).*')
echo $string
0 голосов
/ 27 августа 2010

Если вы используете bash 4.x, вы можете получить oobash. Строка lib, написанная на bash в стиле oo:

http://sourceforge.net/projects/oobash/

Строка - это функция конструктора:

String a abcda

a.indexO

0

a.lastIndexOf

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
...