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