Я хочу извлечь часть строки, соответствующую регулярному выражению. Рассмотрим следующий код, который работает правильно:
regex="ss"
string="blossom"
echo $string | sed "s/^.*\($regex\).*$/\1/"
Выходные данные:
ss
Однако если регулярное выражение не соответствует ничему, возвращается вся строка.
regex="aa"
Выход:
blossom
Это неверно. Если совпадений нет, то ничего не должно возвращаться. Как это можно сделать?
решение1
Как сказал choroba, sed всегда будет печатать строку, по умолчанию, с любыми совпавшими заменами. Вы можете сделать то, что хотите, с помощью:
regex="ss"
string="blossom"
echo $string | sed -n "s/^.*\($regex\).*$/\1/p"
Флаг -n сообщает sed, что не нужно печатать строку, а флаг p в конце команды s/ сообщает sed, что нужно вывести строку с заменами, если она совпала с чем-либо.
решение2
Ваша интерпретация неверна. Вы сказали sed
заменить что-то чем-то другим; если он не нашел ничего для замены, почему он должен что-то удалить? Другими словами, подстановка заменяет то, что совпадает, она не трогает несовпадающие строки. Или, еще одна переформулировка: sed правильно заменил все строки, aa
содержащие aa
.
решение3
Поведение sed правильное, он выводит входную строку EDITED. Очевидно, если во входной строке нет совпадений с заданным токеном, результатом будет входная строка как она есть. Если regex="aa" токен не совпадает и выводится = "blossom".
решение4
Если вы не хотите использовать 'sed', то должно сработать следующее:
[[ $string == *$regex* ]] && echo $regex