Substitua um bloco de texto por outro bloco de texto quando o texto de substituição estiver em um arquivo

1

Eu tenho dois arquivos. O primeiro arquivo é um arquivo de origem C / C ++ existente ( *.cpp ). O segundo é um arquivo de texto ( *.txt ) e contém uma função. A função está nos dois arquivos e precisa ser copiada do segundo arquivo ( *.txt ) para o primeiro arquivo ( *.cpp ). A função também é bastante longa (mais de 890 linhas), portanto copiar / colar é um pouco pesado.

Eu tenho um comando sed para capturar a função no primeiro arquivo ( *.cpp ):

ifile=blake2.cpp.old
ofile=blake2.cpp
ffile=blake2-neon.txt
sed -n '/^static void BLAKE2_NEON_Compress64(/,/^}$/p' < $ifile > $ofile

O que eu não sei é como dizer ao sed para substituir o texto que ele capturou. Eu tentei trabalhar com o manual do GNU sed , mas eu não estou tendo muita sorte. Uma das primeiras coisas a fazer é eliminar o /p .

Como posso dizer ao sed para substituir o bloco de texto que encontra pelo texto de outro arquivo?

Eu encontrei uma pergunta semelhante em Como substituir texto entre dois marcadores em um arquivo com uma seção de texto de outro arquivo? mas eu não acompanho o que está acontecendo, especialmente porque a pergunta está marcada com sed , mas as respostas são fornecidas para ed .

O motivo pelo qual estou tentando fazer o script é: é uma porta de IA-32 SSE para ARM NEON. Eu tenho um script que executa as substituições básicas. Depois de uma alteração, eu preciso copiar a função atualizada para o código-fonte, scp o código para um dispositivo e, em seguida, compilá-lo. Espuma, enxaguar, repita. A cópia / colagem manual de uma função de linha 1000 em cada iteração consome tempo melhor gasto em outras coisas.

    
por jww 09.05.2016 / 06:45

1 resposta

1

Tente algo assim. Combine o início da função, use o comando de leitura r para ler o arquivo de texto. Em seguida, adicione um comando para excluir d todas as linhas entre o início e o final da função:

sed '
/^static void BLAKE2_NEON_Compress64(/r '"$ffile"'
/^static void BLAKE2_NEON_Compress64(/,/^}$/d
' <"$ifile" >"$ofile"

Se a string a ser substituída estiver em uma única linha, você pode tentar isso

uuid='c0e4e6b2-81f4-477c-89a4-7656e58719ce'
sed '/^'"$uuid"'/{
 r '"$ffile"'
 d
}' <"$ifile" >"$ofile"
    
por 09.05.2016 / 09:09