Значение `expr 'hello": "\ ( * \)" `?

Мне нужно объяснение, почему:

$test=`expr "hello" : "\([az]*\)"`; echo $test 

распечатал бы hello , где:

 $test=`expr "hello" : "hel"`; echo $test 

будет возвращать количество совпадающих символов.

А также:

 $ test=`expr "hello123there" : ".*o\([0-9]*\)"t`; echo $test 

уведомление после .* Я должен указать o для его возврата 123 , иначе он ничего не вернет.

2 Solutions collect form web for “Значение `expr 'hello": "\ ( * \)" `?”

Вот как работает выражение соответствия expr .

Если шаблон содержит по крайней мере одно подвыражение регулярного выражения [\(...\)] , возвращается строка, соответствующая обратному ссылочному выражению \1 . hello соответствует \([az]*\) , так что вы вернули его.

expr используется BRE , поэтому вам нужно убежать \( и \) чтобы обозначить подвыражение. Использование ( и ) считается литералом в BRE.

В противном случае вы получите количество совпадающих символов.


В expr "hello123there" : ".*\([0-9]*\)"t вы получили пустую строку. Это потому что жадность регулярного выражения, самая длинная подстрока будет согласована .

Потому что * соответствует ноль или более символов, поэтому [0-9]* может совпадать с нулевым временем, и .* Будет соответствовать самой длинной подстроке hello123 . Вот почему вы получили пустую строку.

Если у вас есть perl , вы можете попробовать:

 printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*([0-9]*)t/' 

а также:

 printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*o([0-9]*)t/' 

чтобы увидеть разницу.


Обратите внимание, что вы всегда должны удвоить кавычки своих переменных. Оставляя переменные без кавычек, вы можете заставить ваш сценарий задохнуться и привести к дырам в безопасности .

Это прямо на странице руководства, EG http://ss64.com/bash/expr.html

Образцы шаблонов возвращают строку, совпадающую между (и) или нулевым; Если (и) не используются, они возвращают количество совпадающих символов или 0.

Interesting Posts

Как и где настроена команда at?

Инструменты для управления пользовательским установочным префиксом для программного обеспечения, скомпилированного из исходного кода?

Как получить доступ к отображению X из задания cron при использовании gdm3?

Сканирование Nmap для устройств с поддержкой SNMP

Что случилось с моей установкой Arch? Случайный причудливый экран с момента последнего обновления

Почему iwconfig в / sbin?

Является ли xkcd универсальный установочный скрипт хорошей идеей?

Как заменить последнее совпадение на строку

Wget не будет рекурсивно загружать

Самый быстрый способ найти и заменить в большом файле при замене поля в другом файле

Как добавить зависимость к systemd.mount, которая активирована / bin / mount?

Безопасно удалить CUPS?

как отключить клавиатуру на debian 9 с помощью ярлыка?

Собственный драйвер NVIDIA по проблемам Jessie Debian

Стабильное распределение серверов без systemd (для OpenVZ)?

Linux и Unix - лучшая ОС в мире.