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

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

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

Выход:

 ss 

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

 regex="aa" 

Вывод:

 blossom 

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

  • разбиение файла на строки, разделенные вкладками на два файла
  • sed - как исключить несколько шаблонов в матче
  • awk + как захватить адрес электронной почты между символами
  • Действительно ли sed \ {x, y \} диапазон жадный?
  • Регулярное выражение для смешанных слов
  • Выберите последний файл, основанный на порядковом номере, указанном в имени файла
  • sed для печати шаблона, который охватывает линии
  • ошибка в awk / sed использование манипуляций с файлами по очереди
  • 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 
    Interesting Posts

    Почему printf выводит больше аргументов, чем ожидалось?

    rpmbuild: как я могу «потребовать» один пакет * или * другой

    Почему использование pipe '|' прекратить второй процесс, есть ли способ предотвратить его?

    Слайд-шоу / заставка на экране входа в систему на RHEL 6.4

    Создание истории tcsh isearch без учета регистра

    Электронная почта не получена с помощью команды mail из терминала в CentOS

    Почему механизм разработки процесса по умолчанию?

    У моей SD-карты есть раздел, но Linux не создает запись устройства для раздела

    Кудрявая скобка путаницы!

    Как проверить, является ли конкретный жесткий диск динамическим?

    Измените командную строку командной строки на команду программ

    Как написать вывод из терминала в новый файл с помощью команд linux без изменения выравнивания?

    Как включить и отключить X11 вне init

    Пропускная способность моста Linux снижается

    Как я могу безопасно удалить старую версию ядра из раздела / boot моей системы Ubuntu?

    Linux и Unix - лучшая ОС в мире.