Как удалить определенную строку и следующую пустую строку с помощью GNU sed?

У меня есть следующий текст:

Start-Date: 2013-11-11 07:43:49 Commandline: apt-get install --no-install-recommends catfish Start-Date: 2013-11-11 11:27:07 Start-Date: 2013-10-16 22:53:02 Start-Date: 2013-10-16 22:55:16 Start-Date: 2013-10-17 22:41:09 Start-Date: 2013-10-17 22:42:02 Start-Date: 2013-10-17 22:42:33 Start-Date: 2013-10-17 22:46:01 Start-Date: 2013-10-17 23:00:06 Commandline: apt-get install shimmer-themes Start-Date: 2013-10-17 23:01:52 Commandline: apt-get install --no-install-recommends gedit 

Я хотел бы удалить строки, начинающиеся с «Start-Date» и следующей пустой строки. Другими словами, я хотел бы иметь просто:

 Start-Date: 2013-11-11 07:43:49 Commandline: apt-get install --no-install-recommends catfish Start-Date: 2013-10-17 23:00:06 Commandline: apt-get install shimmer-themes Start-Date: 2013-10-17 23:01:52 Commandline: apt-get install --no-install-recommends gedit 

Надеюсь, мой вопрос не является дубликат строки «Удалить», содержащей определенную строку, и следующую строку

3 Solutions collect form web for “Как удалить определенную строку и следующую пустую строку с помощью GNU sed?”

 sed '/^Start-Date:/ {N; /\n$/d}' 

sed – редактор потока, разрывает / идентифицирует линейные гагары и у вас с ними.

N – «добавить новую строку и следующую строку ввода в текущий буфер», поэтому \n в буфере – это начало добавленной строки /\n$/d означает «если последняя добавленная строка в буфере пуста, просто нажмите все это".

awk может помочь:

 $ awk '{if ($1=="Commandline:") {printf "%s\n%s\n\n", l,$0}; l=$0}' test.txt Start-Date: 2013-11-11 07:43:49 Commandline: apt-get install --no-install-recommends catfish Start-Date: 2013-10-17 23:00:06 Commandline: apt-get install shimmer-themes Start-Date: 2013-10-17 23:01:52 Commandline: apt-get install --no-install-recommends gedit 

В Perl:

 $ perl -ne 'print $last,"$_\n" if /^Commandline/; $last=$_' foo.txt Start-Date: 2013-11-11 07:43:49 Commandline: apt-get install --no-install-recommends catfish Start-Date: 2013-10-17 23:00:06 Commandline: apt-get install shimmer-themes Start-Date: 2013-10-17 23:01:52 Commandline: apt-get install --no-install-recommends gedit 

Или, чтобы удалить пустые строки:

 $ perl -ne 'print $last,$_ if /^Commandline/; $last=$_' foo Start-Date: 2013-11-11 07:43:49 Commandline: apt-get install --no-install-recommends catfish Start-Date: 2013-10-17 23:00:06 Commandline: apt-get install shimmer-themes Start-Date: 2013-10-17 23:01:52 Commandline: apt-get install --no-install-recommends gedit 

Переключатель -n заставляет perl обрабатывать входной файл по строкам, сохраняя каждую строку в специальной переменной $_ . Сценарий выше выводит текущую строку ( $_ ) и предыдущую строку ( $last ), если текущий начинается с Commandline . Затем он сохраняет текущую строку как $last и переходит к следующей строке.

  • Как использовать Sed для замены всех символов перед двоеточием?
  • Изменить строку в sed?
  • Использование sed для удаления всего двух слов?
  • Использование команды sed изменяет строку на определенной строке с определенной строкой
  • Является ли моя интерпретация `sed -i.bak '/ ^ x / d'" $ SOME_FILE "правильной?
  • sed удалить начало строки с #, но не с #! (shell-скрипты)
  • Почему sed дает мне эту ошибку: ... неизвестная команда: `^ '
  • Сделайте несколько изменений с помощью одного вызова sed
  • Использование sed один раз для поиска / замены разных строк
  • sed - удалить последнее вхождение строки (запятой) в файл?
  • sed: что означает «/»?
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.