Я пытаюсь прочитать строку из файла, сохранить ее в переменной $ line и извлечь все экземпляры (то есть угловые скобки с заглавными буквами между ними). Что я пытаюсь это:

while read line
do
#some other commands
FOUND=`expr $line : \<[A-Z]*\>`
echo FOUND is:$FOUND
#more commands

Когда я запускаю скрипт, я кормлю его:

<hello><HELLO>

выход:

FOUND is:0

Я также попробовал варианты цитат вокруг регулярного выражения. то есть "\<[A-Z]*\>" , '\<[A-Z]*\>' и \(<[A-Z]*>\) где последний из них возвращает ноль.

Я проверил справочную страницу, она должна возвращать 0, если сопоставляются ноль символов или если совпадение не удается. Я чувствую, что это что-то маленькое, что я упускаю из виду, но после часа поиска я все еще не могу понять это.

Любая помощь оценена

1 ответ1

0

Проверьте man-страницу expr : регулярные выражения неявно привязаны, поэтому, если ваша строка $ не начинается со слова верхнего регистра в угловых скобках, expr не найдет его

line="<hello><HELLO>"
expr "$line" : '.*<[[:upper:]]*>'       # => 14
expr "$line" : '.*\(<[[:upper:]]*>\)'   # => <HELLO>

ссылка: https://www.gnu.org/software/coreutils/manual/html_node/String-expressions.html

Обратите внимание, что expr - это не команда bash, а отдельная программа. Если вы хотите сделать это в bash:

if [[ "$line" =~ "<"[[:upper:]]*">" ]]; then
    echo "found it"
    echo "${BASH_REMATCH[0]}"
fi

Кроме того, укажите ваши переменные

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .