метки тега sed

Как я могу обернуть абзацы в виде простого текста с тегами абзаца {p} before и {/p} после каждого абзаца с помощью sed ? Каждый абзац разделяется пустыми строками. Я могу использовать sed -e 's/^\s*$/<r>/ somefile.txt чтобы найти каждую пустую строку в текстовом файле, но это всегда будет вставлять {p} всюду, и я не совсем понимаю, как для их изменения. Кроме того, после последнего абзаца нет пустой строки, поэтому для последнего он ничего не сделает.

Текст ввода:

 Section 5. General Information About Project Gutenberg-tm electronic works. Description Professor Michael S. Hart is the originator of the Project Gutenberg-tm concept of a library of electronic works that could be freely shared with anyone. Project Gutenberg-tm eBooks are often created from several printed editions, all of which are confirmed as Public Domain in the US unless a copyright notice is included. 

Требуемый вывод:

 Section 5. General Information About Project Gutenberg-tm electronic works. {p} Description {/p} {p} Professor Michael S. Hart is the originator of the Project Gutenberg-tm concept of a library of electronic works that could be freely shared with anyone. {/p} {p} Project Gutenberg-tm eBooks are often created from several printed editions, all of which are confirmed as Public Domain in the US unless a copyright notice is included. {/p} 

  • Найти последнее появление строки в нескольких файлах
  • Как мне искать файл для строки, а затем использовать его как переменную?
  • Удалить строки из файла в зависимости от строк, найденных в другом файле
  • Фильтрация или обтекание определенных разделов файла
  • Сортировка одного файла по строке на основе другого файла
  • Извлечь абзац, разделенный на *** с помощью AWK
  • Как копировать и вставлять строки между ключевым словом start и end?
  • Чтобы удалить лишнее пространство из строки с помощью команды оболочки
  • 2 Solutions collect form web for “метки тега sed”

    Поскольку вы изначально запрашивали решение sed , я добавляю один:

     sed '/./{H;1h;$! d} g;/{p}$/d s#^{p}.*#&\n{/p}#;p s/.*/{p}/;h;d' somefile.txt 

    объяснение

    • строка 1: добавьте непустые строки в буфер удержания (1-я строка скопирована вместо добавления, чтобы не начинаться с новой строки). Продолжить для пустых строк или конца файла.
    • строка 2: игнорировать буферы без текста для обработки нескольких пустых строк или пустых строк в конце буфера
    • строка 3: если есть открывающий тег, добавьте закрывающий тег. Затем распечатайте.
    • строка 4: Заполните буфер удержания новым открывающим тегом.

    Я бы предложил awk- подход:

     awk 'NR>1 && NF{$0="{p}" RS $0 RS "{/p}"}1' file 

    Выход:

     Section 5. General Information About Project Gutenberg-tm electronic works. {p} Description {/p} {p} Professor Michael S. Hart is the originator of the Project Gutenberg-tm concept of a library of electronic works that could be freely shared with anyone. For thirty years, he produced and distributed Project Gutenberg-tm eBooks with only a loose network of volunteer support. {/p} {p} Project Gutenberg-tm eBooks are often created from several printed editions, all of which are confirmed as Public Domain in the US unless a copyright notice is included. Thus, we do not necessarily keep eBooks in compliance with any particular paper edition. {/p} 

    RS awk разделитель записей, по умолчанию используется новая строка \n

    NR>1 – пропускает первую строку заголовка

    NF – указывает на общее количество полей линии (учитывая непустые строки)

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