Как удалить строки, соответствующие foo, но не соответствующие строке?

Предположим, что я хочу удалить вторую и третью, но не четвертую строку в следующем файле (те, которые соответствуют foo, но не соответствуют бару), могу ли я легко сделать это, например, sed?

text foo some more text even more foo text some foo text with bar 

2 Solutions collect form web for “Как удалить строки, соответствующие foo, но не соответствующие строке?”

Несколько альтернатив:

 awk '! (/foo/ && !/bar/)' awk '/bar/ || !/foo/' sed -e /bar/b -e /foo/d sed '/foo/{/bar/!d;}' perl -ne 'print unless /foo/ && !/bar/' 

GNU grep с поддержкой PCRE:

 grep -vP '^(?!.*bar).*foo' 

(с помощью оператора PCRE с отрицательным внешним ожиданием (?!...) ).

Из них только perl позволяет на месте редактировать портативно (в системах, где установлена ​​любая версия perl ) с опцией -i .

Стандартный sed не делает редактирования на месте. Однако sed некоторых недавних BSD разрешает его с опцией -i '' и GNU sed с -i (оба моделируются после perl ) в качестве расширения.

Самые последние версии GNU awk также позволяют использовать его с -i inplace .

Мне кажется, это работает так:

 sed '/foo/{/bar/!d;}' my_file 
  • Помогите с пониманием регулярного выражения
  • Замена шаблона в строке, предшествующей другому интересующему образцу
  • Текст цензора с регулярным выражением
  • bash regex для поиска и сохранения строки из файла
  • Удалить все до «/» на каждой строке
  • Как вы можете объединить все строки, которые заканчиваются символом обратной косой черты?
  • Regex, который будет grep-номера после определенной строки
  • Классы символов: постройте собственные
  • Поиск текста между двумя конкретными символами или строками
  • Как извлечь сходство между двумя строками
  • Interesting Posts

    Как настроить Kate, чтобы всегда использовать 2 пробела для табуляции?

    Как я могу сопоставить этот текст в awk, напечатать номера строк для совпадений?

    Компиляция g ++ из исходного кода приводит к повреждению стандартной библиотеки. error: ':: realloc' не был объявлен

    Удалить устройство PulseAudio

    apt-get через ssh-tunnel, если разрешен только порт 22

    Сценарий загрузки Linux Networking слишком долго

    Почему домашний каталог не создается при создании нового пользователя?

    Виртуальное USB-устройство HID

    Как автоматически запускать скрипт при подключении устройства Bluetooth?

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

    Значение пересечения границ файловой системы, – однофайловая система и т. Д.

    Разделение ОС на SSD с пользовательских настроек и приложений на жестком диске

    Перезагрузка внутри режима спасения chroot

    Сломанная символическая ссылка / usr / bin / env?

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

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