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

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

regex="ss" string="blossom" echo $string | sed "s/^.*\($regex\).*$/\1/" 

Выход:

  • Может ли интерактивная оболочка стать неинтерактивной или наоборот?
  • Как сохранить символ возврата каретки (\ n) при выходе вывода команды в переменную
  • Как я могу сказать, какая команда означает псевдоним?
  • простая команда для удаления заголовка и нижнего колонтитула из файла
  • Почему переменная передается команде su, но не массив из той же области?
  • Выбор и сортировка IP-адреса, поддерживающего всю строку
  •  ss 

    Однако, если регулярное выражение ничего не соответствует, возвращается вся строка.

     regex="aa" 

    Вывод:

     blossom 

    Это неверно. Когда нет совпадения, ничего не нужно возвращать. Как это можно сделать?

  • Использовать переменные в этой строке
  • Греп, чтобы найти правильную строку, sed, чтобы изменить содержимое, а затем вернуть его в исходный файл?
  • Почему bash.exe запускается дважды при использовании --login?
  • Выход Выход команды непосредственно в командную строку, НЕ переменную
  • для цикла с многострочными данными
  • Разверните вывод последних двух команд
  • 4 Solutions collect form web for “sed не различает полное совпадение регулярных выражений и отсутствие соответствия”

    Как сказал choroba, sed всегда будет печатать линию по умолчанию с любыми подстановками, которые совпадают. Вы можете делать то, что хотите:

     regex="ss" string="blossom" echo $string | sed -n "s/^.*\($regex\).*$/\1/p" 

    Команда -n сообщает sed не печатать строку, а затем p в конце команды s / sed сообщает sed распечатать строку с заменой, если она соответствует чему-либо.

    Ваша интерпретация неверна. Вы сказали sed заменить что-то другим; он не нашел ничего, чтобы заменить его, зачем ему ничего удалять? Другими словами, замена заменяет совпадения, она не затрагивает несогласованные строки. Или, еще одна переформулировка: sed правильно заменил все строки, содержащие aa aa .

    поведение sed правильное, оно печатает входную строку EDITED. очевидно, если на входной строке с заданным токеном ничего не соответствует, результатом является входная строка, как есть. когда regex = "aa" оцененный токен не соответствует и распечатывает = "blossom".

    Следующее должно работать, если вы хотите пойти без использования «sed»:

     [[ $string == *$regex* ]] && echo $regex 
    Linux и Unix - лучшая ОС в мире.