URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5674
[ Назад ]

Исходное сообщение
"поиск подстроки в строке"

Отправлено akov , 29-Авг-06 12:58 
Задача найти вхождение подстроки в строке
var1="234 345 456"
var2="345"
Делаю echo `expr match "$var1" '\("$var2"\)'`
выдает пусто...хотя должен 345
если задаю так:
echo `expr match "$var1" '\("345"\)'` тоже пусто
echo `expr match "$var1" '\("$234"\)'`
выдает 234...
НЕ могу понять в чем причина!!! Подскажите плз.!!


Содержание

Сообщения в этом обсуждении
"поиск подстроки в строке"
Отправлено regunkov , 29-Авг-06 13:38 
>Задача найти вхождение подстроки в строке
>var1="234 345 456"
>var2="345"
>Делаю echo `expr match "$var1" '\("$var2"\)'`
>выдает пусто...хотя должен 345
>если задаю так:
>echo `expr match "$var1" '\("345"\)'` тоже пусто
>echo `expr match "$var1" '\("$234"\)'`
>выдает 234...
>НЕ могу понять в чем причина!!! Подскажите плз.!!

Немного не в тему, но если в качестве разделителя один из символов $IFS, то можно искать средствами шела.

findflag() {
    local l_name l_flag l_w

    l_name="$1"
    l_flag="$2"
    
    for l_w in $(eval echo -E \"\${${l_name}}\"); do
    case "${l_w}" in
        ("${l_flag}")
        return 0
        ;;
        (*)
        continue
        ;;
    esac
    done
    
    # not found
    return 1
}

var1="234 345 456"
var2="345"

findflag "var1" "$var2" && echo -E "$var2"


"поиск подстроки в строке"
Отправлено olegos , 31-Авг-06 06:03 
>>Задача найти вхождение подстроки в строке
>>var1="234 345 456"
>>var2="345"
>>Делаю echo `expr match "$var1" '\("$var2"\)'`
>>выдает пусто...хотя должен 345
>>если задаю так:
>>echo `expr match "$var1" '\("345"\)'` тоже пусто
>>echo `expr match "$var1" '\("$234"\)'`
>>выдает 234...
>>НЕ могу понять в чем причина!!! Подскажите плз.!!
>
>Немного не в тему, но если в качестве разделителя один из символов
>$IFS, то можно искать средствами шела.
>
>findflag() {
>    local l_name l_flag l_w
>
>    l_name="$1"
>    l_flag="$2"
>
>    for l_w in $(eval echo -E \"\${${l_name}}\"); do
>
> case "${l_w}" in
>     ("${l_flag}")
>     return 0
>     ;;
>     (*)
>     continue
>     ;;
> esac
>    done
>
>    # not found
>    return 1
>}
>
>var1="234 345 456"
>var2="345"
>
>findflag "var1" "$var2" && echo -E "$var2"
>


expr match "$var1" ".*$var2"
у меня выдает номер последнего найденого символа


"поиск подстроки в строке"
Отправлено Bootmen , 31-Авг-06 16:29 
>Задача найти вхождение подстроки в строке
>var1="234 345 456"
>var2="345"

Не мучайся , есть универсальное средство awk
echo var1 | awk ' { if match($0, /"'$var2'"/)
{ print RSTART, RLENGTH, $0 }
  }'
exit 0

Простенько и со вкусом. Вобщем awk на все руки мастер.
В выше примере он ищет начало (RSTART) и конец (RLENGTH) искомой строки,
а потом его распечатывает.
Можно в /.../ использовать регулярные выражения.


"поиск подстроки в строке"
Отправлено Bootmen , 31-Авг-06 17:21 
Пардон ошибка вкралась: echo $var1|awk....
Так правильнее будет