Como posso prefixar uma tag no início de vários arquivos?

16

Eu preciso adicionar tags PHP em torno de um arquivo. É fácil anexá-los usando

find . -exec echo "?>" >> '{}' \;

mas como posso prefixar a tag <?php ?

    
por Gilles 06.09.2009 / 11:33

7 respostas

17
sed -i "1s/^/<?php /" file

(O -i é para edição no local.)

Mais versão portátil:

ed file <<!
1s/^/<?php /
wq
!
    
por 06.09.2009 / 12:18
5

Você pode usar um filtro AWK como este,

awk '{if(NR==1) printf "%s%s","PREFIX",$0; else print $0}' testfile > newfile

Onde PREFIX é sua string de prefixo php.

    
por 06.09.2009 / 12:19
5

Ainda não posso deixar um comentário, mas fazer tudo de uma só vez:

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;
    
por 06.09.2009 / 15:49
5

Você pode fazer isso com um perl one-liner:

perl -0777 -p -i -e "s/^/hey /g" testfile

O -0777 força o modo de arrastar arquivos, portanto, o arquivo inteiro é lido como uma linha. -p permite o loop. -i permite a edição no local do arquivo. ^ indica o começo de uma linha.

$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf

Atualização: Conforme indicado nos comentários, você pode optar por gerar um backup automaticamente usando -i.bak em vez de -i . Isso fornece segurança adicional em caso de erros no seu comando. O argumento para -i se torna o sufixo do backup.

Ao atualizar um monte de arquivos, você pode executar o comando com -i.backup${RANDOM} , verificar se todos os arquivos foram atualizados corretamente e, em seguida, remover todos os arquivos com essa extensão.

    
por 06.09.2009 / 11:58
3

sed é para editar fluxos - um arquivo não é um fluxo. Use um programa destinado a esse propósito, como ed ou ex . A opção -i para sed não é apenas não portável, ela também irá quebrar quaisquer links simbólicos que você possa encontrar, já que essencialmente a deleta e recria, o que é inútil.

for file in foo bar baz; do
    ed -s "${file}" << EOF
0a
<?php 
.
w
EOF
done
    
por 18.09.2011 / 00:44
0

Uma alternativa ao que você escreveu para adicionar algo ao final de cada arquivo no diretório (em bash ):

for FNAME in *
do
    echo "?>" >> $FNAME
done

embora eu goste de seu find one-liner:)

    
por 06.09.2009 / 16:10
0

Existe o caminho simples

echo "startstr$(cat filename)endstring" > filename.new
    
por 19.06.2013 / 16:44