sed не различает полное совпадение с регулярным выражением и отсутствие совпадения

sed не различает полное совпадение с регулярным выражением и отсутствие совпадения

Я хочу извлечь часть строки, соответствующую регулярному выражению. Рассмотрим следующий код, который работает правильно:

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

Связанный контент