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

Я хочу заменить все вхождения текстовой строки в текстовом файле в командной строке на 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 ... 

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 вместо строк новой строки. Это легко позволит вам сопоставлять шаблоны, пересекающие новую строку, но приведет к тому, что операции с строкой будут выполняться сразу на всем входе, что может быть проблемой при большом вводе.

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

  • Команда sed: N не читает одну строку
  • Вставьте несколько строк после матча с помощью команды sed sed
  • вырезать первый и последний элемент в CSV
  • Шаблон Regex для замены нескольких значений с помощью sed
  • Заменяйте строки, соответствующие шаблону, строками из другого файла в порядке
  • вернуть первый экземпляр символов из списка
  • Использование sed для удаления целой строки, если оно содержит только определенный номер
  • Заменить непечатаемые символы в perl и sed
  • Как правильно добавить концы строк с помощью sed?
  • Как вставить текст после определенной строки в файл?
  • как использовать tr для удаления восьмеричной последовательности символов?
  • многострочная замена заменяет предыдущий вывод
  • Linux и Unix - лучшая ОС в мире.