Вы пометили вопрос как 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 ... }'))