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

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

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

Выход:

 ss 

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

 regex="aa" 

Вывод:

 blossom 

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

  • Замените каждое нечетное или даже появление шаблона в файле
  • Удалить узел XML, содержащий определенный элемент
  • Проблема удаления / замены специального символа °
  • Как удалить апостроф (') из нескольких столбцов файла .CSV?
  • Вырезать определенную часть столбца из файла csv
  • (Mac Terminal) sed для анализа JSON ... что я делаю неправильно?
  • Согласование многострочного шаблона с помощью sed, awk или grep
  • Как удалить первые n строк и последнюю строку файла с помощью команд оболочки?
  • 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 - лучшая ОС в мире.