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

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

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

Выход:

 ss 

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

 regex="aa" 

Вывод:

 blossom 

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

  • Как заменить определенные строки?
  • Как использовать grep или sed для извлечения нескольких совпадений в одной строке
  • как изменить замену слова в конкретной строке с помощью команды sed?
  • Удалите первые n строк из файла с переменной
  • Как извлечь строки между одинаковыми шаблонами из файла
  • Использование sed для замены кода javascript в нескольких файлах
  • Удаление строк, содержащих повторяющийся текст
  • Замените указанную строку на время ее появления с помощью sed или awk
  • 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

    Как отключить CTRL, действующий на импульс тачпада в Cinnamon?

    "/lib64/libc.so.6: версия` GLIBC_2.7 "не найдена" Ошибка при установке пакета R

    Случайный измененный контекст SELinux в учетной записи root для staff_u

    Как включить ping между машинами, подключенными к двум интерфейсам?

    Можете ли вы представить новые пакеты для существующих выпусков Debian?

    SSH: «Permission denied» после изменения оболочки пользователя

    Откройте каталог и дайте ему обновить себя, используя «tail -f»

    «Ошибка: неявное объявление функции« vfs_readlink »при установке VMware Tools

    Можем ли мы включить Networking в однопользовательском режиме Linux?

    Как разбирать аргументы командной строки с произвольной строкой

    Как связать arduino как фиксированное блок-устройство – / dev / ttyACM0?

    Почему система состоит из последовательностей, имеющих приоритет над моим .XCompose файлом в приложениях Qt?

    Существует ли такая команда, которая показывает пропускную способность сети и доступ к файлам запущенных процессов

    Firefox, работающий на скопированной копии Antergos, не работает

    Используйте `dd` для вырезания концевой части файла

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