Задача найти вхождение подстроки в строке
var1="234 345 456"
var2="345"
Делаю echo `expr match "$var1" '\("$var2"\)'`
выдает пусто...хотя должен 345
если задаю так:
echo `expr match "$var1" '\("345"\)'` тоже пусто
echo `expr match "$var1" '\("$234"\)'`
выдает 234...
НЕ могу понять в чем причина!!! Подскажите плз.!!
>Задача найти вхождение подстроки в строке
>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_wl_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"
>>Задача найти вхождение подстроки в строке
>>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"
у меня выдает номер последнего найденого символа
>Задача найти вхождение подстроки в строке
>var1="234 345 456"
>var2="345"Не мучайся , есть универсальное средство awk
echo var1 | awk ' { if match($0, /"'$var2'"/)
{ print RSTART, RLENGTH, $0 }
}'
exit 0Простенько и со вкусом. Вобщем awk на все руки мастер.
В выше примере он ищет начало (RSTART) и конец (RLENGTH) искомой строки,
а потом его распечатывает.
Можно в /.../ использовать регулярные выражения.
Пардон ошибка вкралась: echo $var1|awk....
Так правильнее будет