Хотя я почти уверен, что это было рассмотрено, я не могу найти ничего конкретного по этому поводу. Продолжая свое путешествие по изучению bash, я продолжаю находить моменты, в которых я сбит с толку тем, почему все происходит именно так.
Поиск и замена или просто сопоставление подстрок в строках, скорее всего, является одним из первых действий, которые вы делаете при написании скриптов. Но пытаться придерживаться одного языка или набора инструментов сложно в bash, так как вы можете решить большую часть проблемы несколькими способами. Я делаю все возможное, чтобы оставаться с bash на как можно более низком уровне. Я столкнулся с загвоздкой, которую мне нужно, чтобы кто-то объяснил мне.
Выполнение поиска подстроки в bash с совпадением дает мне разные результаты в зависимости от используемого регулярного выражения, и я не уверен, почему.
#!/bin/bash
Stext="Hallo World"
echo `expr "$Stext" : '^\(.[a-z]*\)'` # Hallo
echo `expr "$Stext" : '.*World'` # 11
Хотя оба ищут слово, я думаю, оба не возвращают то, что находят. Почему?
expr
вообще не является функциональностью bash — это внешний инструмент, который не является частью оболочки. Следовательно, не гарантируется, что его поведение будет согласованным с данной версией bash при установке на разных платформах, за исключением минимальных гарантий, предоставляемых стандартом POSIX sh (гарантии, которые не обещают никакого синтаксиса регулярных выражений, кроме BRE). Кроме того, внешний вид означает, что он гораздо выполняется медленнее, требуяfork()
для запуска подоболочки иexec()
для замены этой оболочки внешним исполняемым файлом. - person Charles Duffy   schedule 08.08.2018expr
является внешним инструментом, вы повторяете результаты вызова команды в подоболочке, что делает ее вдвойне неэффективной. Эти вызовы должны быть развернуты, например.expr "$Stext" : '^\(.[a-z]*\)'
. (см. superuser.com/questions/1352850/ для подробного объяснения) - person JakeRobb   schedule 22.07.2021