Как удалить строки, соответствующие 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 
  • Regex, который будет grep-номера после определенной строки
  • Как заменить текст в столбце
  • Извлечение подмножества строк файла на основе регулярного выражения для первой и последней строки
  • Как извлечь сходство между двумя строками
  • Помогите с пониманием регулярного выражения
  • Команда командной строки для добавления пробела к регулярному выражению
  • Извлечение определенных строк набора, соответствующих правилу
  • Расширение списка, разделенного запятыми, на отдельные строки
  • исключить строки из файла на основе определенных значений в определенных столбцах
  • Замена шаблона в строке, предшествующей другому интересующему образцу
  • Linux и Unix - лучшая ОС в мире.