Как искать и заменять строку символами новой строки в командной строке в файле

Я хочу заменить все вхождения текстовой строки в текстовом файле в командной строке на CentOS 7.2.

Search-string: ).\nPORT Replacement-string: ). \n0 closed ports\nPORT 

Я знаю, это может быть достигнуто с помощью различных инструментов, таких как sed , awk , tr , … но я не могу найти простой способ сделать это и понять команду (important ;-)). Для меня самой большой проблемой являются новые строки, без них это очень простой вызов sed . Но с новостями …

Любое предложение с объяснением очень приветствуется.

отредактированный

вход

 ... Nmap scan report for wxyz (xxxx) Host is up (0.00090s latency). PORT STATE SERVICE 21/tcp open ftp ... Nmap scan report for wxyz (xxxx) Host is up (0.00079s latency). Not shown: 2 closed ports PORT STATE SERVICE 22/tcp open ssh |_banner: SSH-2.0-mpSSH_0.2.1 ... 

Вывод

 ... Nmap scan report for wxyz (xxxx) Host is up (0.00090s latency). 0 closed ports PORT STATE SERVICE 21/tcp open ftp ... Nmap scan report for wxyz (xxxx) Host is up (0.00079s latency). Not shown: 2 closed ports PORT STATE SERVICE 22/tcp open ssh |_banner: SSH-2.0-mpSSH_0.2.1 ... 

  • Добавить порядковый номер за данными
  • Объединение альтернативных строк из двух файлов
  • Как заменить все вхождения в файле уникальным значением для каждого события
  • Вывод различных строк при сравнении двух файлов
  • Объединить два greps в одну команду
  • Обратное совпадение в sed, замените противоположное тому, что было найдено
  • Как заменить «&» на «& amp;», за исключением того, что уже является частью XML-объекта?
  • Замена символа подчеркивания запятой и удаление двойных кавычек в CSV
  • 2 Solutions collect form web for “Как искать и заменять строку символами новой строки в командной строке в файле”

    Вот один из возможных способов

     sed '/)\. $/ { n /^PORT/ i\ 0 closed ports }' 

    тестирование

     $ sed '/)\. $/ { n /^PORT/ i\ 0 closed ports }' < input ... Nmap scan report for wxyz (xxxx) Host is up (0.00090s latency). 0 closed ports PORT STATE SERVICE 21/tcp open ftp ... Nmap scan report for wxyz (xxxx) Host is up (0.00079s latency). Not shown: 2 closed ports PORT STATE SERVICE 22/tcp open ssh |_banner: SSH-2.0-mpSSH_0.2.1 ... 

    Вы можете использовать N в sed, чтобы вытащить следующую строку ввода в пространстве шаблонов, а затем работать с двумя строками одновременно.

    В качестве примера условно вытащите следующую строку при просмотре foo , а затем выполните замену на обе строки. (Обратите внимание, что последовательные строки с foo сломают это.)

     echo -e "asf\nfoo\nbar" | sed -e '/foo/N;s/o\nb/od\nc/' 

    Кроме того, GNU sed имеет опцию -z которая отделяет «строки» от символов NUL вместо строк новой строки. Это легко позволит вам сопоставлять шаблоны, пересекающие новую строку, но приведет к тому, что операции с строкой будут выполняться сразу на всем входе, что может быть проблемой при большом вводе.

    Естественно, что окружающая структура должна учитываться, это может повлиять на лучший способ редактирования.

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