Добавить текст в определенные блоки, определенные некоторыми специальными символами в sed - PullRequest
0 голосов
/ 16 июня 2019

У меня есть сотни книг в текстовом формате, которые будут преобразованы в epub и pdf с помощью pandoc.Каждый текстовый файл содержит простой текст и стихи.Выравнивание стихов является повторяющейся задачей.Каждая вторая строка каждого стихотворения должна быть предназначена.Мне нужно добавить какой-то специальный символ в каждую строку каждой поэмы, скажем, ==.

Мой вопрос:

here are some text  

poem line 1  
poem line 2  
poem line 3  
poem line 4  

here are some text

poem line 1  
poem line 2  

Мне нужен вывод

here are some text  

poem line 1  
==poem line 2  

here are some text  

poem line 1  
==poem line 2  
poem line 3  
==poem line 4  

Моя идея такова:

Если мы определяем блоки стихотворений каким-то специальным символомкак

~   
poem line 1  
poem line 2  
~~  

~  
poem line 1  
poem line 2  
poem line 3  
poem line 4  
~~  

sed находит это ~ и добавляет == в каждые 3 + 2 строки и заканчивается ~~.

вывод должен выглядеть следующим образом

~   
poem line 1  
== poem line 2  
~~  

~  
poem line 1  
== poem line 2  
poem line 3  
== poem line 4  
~~  

Возможно ли это сделать с помощью sed, awk или любых других скриптов?

http://xensoft.com/use-sed-to-insert-text-every-n-lines-characters/

Ответы [ 3 ]

0 голосов
/ 16 июня 2019

Это может сработать для вас (GNU sed):

sed '/^~\s*$/{:a;n;/^~~\s*$/b;n;//b;s/^/== /;ba}' file

Вставьте == перед второй строкой каждого стихотворения, где стихи ограничены ~ и ~~.

0 голосов
/ 16 июня 2019

sed предназначен для выполнения s/old/new для отдельных строк, , то есть всего .Это совершенно неуместная задача для sed, абсолютно тривиальная для awk, и именно тот тип задач, который awk создал, для выполнения, и вам не нужно добавлять дополнительные ~ разделители к вашему тексту, чтобы просто получить вывод, который вы опубликовали изпервый блок ввода, который вы опубликовали:

$ awk -v RS= -F'\n' '{for (i=1; i<=NF; i++) print (i%2?"":"==") $i; print ""}' file
here are some text

poem line 1
==poem line 2
poem line 3
==poem line 4

here are some text

poem line 1
==poem line 2

Вышеописанное будет работать при использовании любого awk в любой оболочке на каждом блоке UNIX.

0 голосов
/ 16 июня 2019
sed '/^$/b;n;/^$/b;s/^/--/' input
  • /^$/b: если строка пуста, выведите ее и начните снова со следующей строки.
  • n: напечатайте текущую строку и получите следующую.
  • s/^/--/: добавить специальные символы в строку.

Вывод:

here are some text  

poem line 1  
--poem line 2  
poem line 3  
--poem line 4  

here are some text

poem line 1  
--poem line 2 

Вы можете использовать разделители, как вы предлагали:

here are some text
@+
poem line 1  
poem line 2  
poem line 3  
poem line 4  
@-
here are some text
@+
poem line 1  
poem line 2 
poem line 3
@-

С помощью этой команды:

sed '/@+/!b;:l;n;/@-/b;n;/@-/b;s/^/--/;bl;' input

Вы получите:

here are some text
@+
poem line 1  
--poem line 2  
poem line 3  
--poem line 4  
@-
here are some text
@+
poem line 1  
--poem line 2 
poem line 3
@-
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...