Aqui está uma maneira com sed
:
sed '
s|"\(.*\)"[[:blank:]]*:[[:blank:]]*"\(.*\)"|\
|
h
s|.*\n||
s|[\&/]|\&|g
x
s|\n.*||
s|[[\.*^$/]|\&|g
G
s|\(.*\)\n\(.*\)|s///g|
' dictionary.txt | sed -f - novel.txt
Como funciona:
O primeiro sed
transforma dictionary.txt
em um arquivo de script (comandos de edição, um por linha). Isso é canalizado para o segundo sed
(observe o -f -
que significa comandos de leitura de stdin
) que executa esses comandos, editando novel.txt
.
Isso requer a tradução do seu formato
"STRING" : "REPLACEMENT"
em um comando sed
e escapando de qualquer caractere especial no processo para LHS
e RHS
:
s/ESCAPED_STRING/ESCAPED_REPLACEMENT/g
Então a primeira substituição
s|"\(.*\)"[[:blank:]]*:[[:blank:]]*"\(.*\)"|\
|
transforma "STRING" : "REPLACEMENT"
em STRING\nREPLACEMENT
( \n
é um caractere de nova linha). O resultado é então copiado sobre o espaço h
old.
s|.*\n||
exclui a primeira parte mantendo apenas REPLACEMENT
, em seguida, s|[\&/]|\&|g
escapa dos caracteres reservados (esse é o RHS
).
Em seguida, e x
altera o buffer de retenção com o espaço de padrão e s|\n.*||
exclui a segunda parte, mantendo apenas STRING
e s|[[\.*^$/]|\&|g
fazendo o escape (esse é o LHS
).
O conteúdo do buffer de retenção é então anexado ao espaço de padrão via G
, então agora o conteúdo do espaço de padrão é ESCAPED_STRING\nESCAPED_REPLACEMENT
.
A substituição final
s|\(.*\)\n\(.*\)|s///g|
transforma em s/ESCAPED_STRING/ESCAPED_REPLACEMENT/g