Я часто нахожу это в сценариях (и, должен признать, сам это пишу):
a=$(echo "$x" | sed "s/foo/bar/")
или
if echo "$x" | grep -q foo
then
...
fi
Рассмотрим "foo", чтобы включить некоторые регулярные выражения.
Я чувствую, что должен быть - и, скорее всего, есть - лучший способ выразить это, тот, который не включает в себя две команды и конвейер, но оборачивает вещь в какое-то более компактное выражение.
Я просто не могу найти это. Кто-нибудь?
$()
обратных кавычек.a="$(echo "$x" | sed "s/foo/bar/")"
иif echo "$x" | grep foo; …
.Ответы:
Если вы не предполагаете конкретную оболочку, нет лучшего способа сделать это, чем «pipe echo to tool» (или просто сам «инструмент», такой как expr ); это все, на что вы действительно можете рассчитывать с традиционной оболочкой Bourne и / или оболочкой POSIX . Если вы рассматриваете другие оболочки, то есть некоторые другие встроенные возможности.
Кш имеет
?(pattern-list)
,*(pattern-list)
,{n}(pattern-list)
,{n,m}(pattern-list)
,@(pattern-list)
,!(pattern-list)
;%P
Printf спецификатор , чтобы преобразовать расширенное регулярное выражение в образец (и%R
для расширенного регулярного выражения к шаблону);expr == pattern
условие[[ expr ]]
испытаний;${param/pattern/replacement}
расширение параметра.Баш имеет
extglob
вариант для того, чтобы большинство дополнительных моделей KSH (нет{n}
и{n,m}
);expr == pattern
условие (в[[ expr ]]
тестах);${param/pattern/replacement}
расширение параметра;expr =~ extregexp
условие (в[[ expr ]]
тестах), которое может соответствовать расширенным регулярным выражениямBASH_REMATCH
параметром можно было бы сделать замены в стиле sed .зш имеет
EXTENDED_GLOB
опцией;KSH_GLOB
опцией;expr == pattern
условие (в[[ expr ]]
тестах);${pattern/pattern/replacement}
расширение параметра;expr =~ extregexp
условие (в[[ expr ]]
тестах) , которые могут соответствовать против расширенных регулярных выражений,MATCH
параметром иmatch
параметром (илиBASH_REMATCH
с установленнымBASH_REMATCH
параметром) можно выполнить замены в стиле sed ;zsh/pcre
модуль , который предлагаетpcre_compile
,pcre_study
иpcre_match
команда и-pcre-match
тест выполняется условие (в[[ expr ]]
тестах);zsh/regex
модуль , который предлагает-regex-match
тестовое условие (в[[ expr ]]
тестах).источник
Чтобы заменить строку sed, сделайте что-то вроде
${a/foo/bar}
или${a//foo/bar}
В первой форме заменяется только первый экземпляр. Вторая форма - это глобальный поиск и замена.
В вашем случае это было бы
Вместо того:
Рассмотрите возможность использования:
Где
foo
это регулярное выражение.источник
if [ $x =~ foo ]
выдает здесь сообщение об ошибке.if [[ $x =~ foo ]]
Однако прекрасно работает. Благодарность!=~
требуется bash> = 3 iirc.${a##foo}
и${a%%bar}
.=~
использует регулярные выражения. Это верно, например:[[ "abcdddde" =~ ^a.*d+.g* ]]
(это ноль или больше g, а не g-wildcard, например).Хороший способ, совместимый с posix, для тестирования, если переменная содержит шаблон:
Синтаксис расширения параметра :
где
pattern
это шаблон оболочки .источник