Como substituir parte de um arquivo de texto entre marcadores com outro arquivo de texto?

22

Digamos que eu tenha um arquivo de texto como este:

# custom content section
a
b

### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT

Gostaria de substituir a parte entre as tags GENERATED CONTENT pelo conteúdo de outro arquivo.

Qual é a maneira mais simples de fazer isso?

    
por smokris 22.06.2012 / 05:00

4 respostas

4
newContent='cat new_file'
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\n).*(\n### END GENERATED CONTENT)/\$newContent\/s" existing_file
    
por 22.06.2012 / 06:39
30
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
        }; /$tail/p; d }"  existing_file
    
por 22.06.2012 / 08:53
4

Atenção: Esta definitivamente não é a maneira mais simples de fazer isso. (EDIT: bash funciona; POSIX grep também está bom)

Se o texto principal estiver no arquivo "main" e o conteúdo gerado estiver no arquivo "gen", você poderá fazer o seguinte:

#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*//g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*//g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main
    
por 22.06.2012 / 05:50
1
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
    
por 04.09.2014 / 01:25