Como posso acrescentar uma tag ao início de vários arquivos?

18

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

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

mas como posso acrescentar a tag <?php?

Gilles 'SO- parar de ser mau'
fonte

Respostas:

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

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

Versão mais portátil:

ed file <<!
1s/^/<?php /
wq
!
gravidade
fonte
bacana - que é um pouco mais fácil do que o que eu estava prestes a descrever :)
Warren
Eu preciso adicionar a extensão ao argumento -i aqui. Você está usando sed ou GNU sed?
Richard: O que eu estou usando afirma ser GNU sed, e permite adicionar um sufixo de backup.
grawity
2
Estou usando o BSD sed e ele permite a edição no local, mas preciso dar uma extensão. ou seja, 'sed -i .bak "PATTERN" file "
3
-inão é portátil, a sintaxe difere entre as implementações e quebra os links simbólicos. Seria melhor usar um aplicativo que foi realmente projetado para editar arquivos.
Chris Baixo
5

Você pode usar um AWKfiltro como este,

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

Onde PREFIXestá sua string de prefixo php.

nik
fonte
5

Ainda não posso deixar um comentário, mas para fazer tudo em uma única etapa:

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;

fonte
Adorei, me salvou horas.
Steve Hill
5

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

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

As -0777forças modo de sorver arquivo, então o arquivo inteiro é lido como uma linha. -pativa o loop. -ipermite a edição no local do arquivo. ^indica o início 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 automaticamente um backup usando em -i.bakvez 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 -i.backup${RANDOM}, verificar se todos os arquivos foram atualizados corretamente e remover todos os arquivos com essa extensão.

Nagul
fonte
11
"O valor 0777 fará com que o Perl descarte os arquivos inteiros porque não há byte legal com esse valor", consulte sial.org/howto/perl/one-liner/#s3.5
Chris W. Rea
11
Se você recomendar o uso da -ibandeira sem sufixo, avise os leitores que isso significa que você não recebe backup . Para alguns caracteres a mais ( -i.bak), você obtém um backup caso o seu one-liner inclua um erro de digitação. Um erro de digitação bastante simples (digamos, esquecer a -pbandeira) pode arruinar o dia inteiro.
Telemachus
@Telemachus - Concordou. Atualizada.
4

sedé para editar fluxos - um arquivo não é um fluxo. Use um programa destinado a esse fim, como edou ex. A -iopção sednão apenas não é portátil, mas também quebra todos os links simbólicos que você pode encontrar, uma vez que o exclui e recria, o que é inútil.

for file in foo bar baz; do
    ed -s "${file}" << EOF
0a
<?php 
.
w
EOF
done
Chris Down
fonte
O que você apresentou é uma maneira básica de editar um único arquivo. Isso não parece responder ao problema - a questão é modificar vários arquivos (embora possa não ser óbvio à primeira vista). Se você souber usar edpara esse fim, mostre isso na sua resposta.
rozcietrzewiacz
@rozcietrzewiacz - Como o grawity demonstrou o mesmo método de editar um único arquivo (que foi aceito), pensei que era apropriado para a resposta. De qualquer forma, coloquei um loop for, o que deve facilitar suas preocupações.
Chris Baixo
0

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

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

embora eu goste do seu findone-liner :)

Warren
fonte
$FNAMEdeve ser $fname- por convenção, nós capitalizar variáveis de ambiente (pager, EDITOR, SHELL, ...) e variáveis do shell internos (BASH_VERSION, aleatório, ...). Todos os outros nomes de variáveis ​​devem conter pelo menos uma letra minúscula. Esta convenção evita a substituição acidental de variáveis ​​ambientais e internas.
Chris Baixo
@ Chris Down - a convenção eu vi toda a minha carreira tem variado por definição: letras minúsculas, maiúsculas e camelcase :)
Warren
Camelcase e minúsculas são boas. De qualquer forma, as variáveis ​​que não são variáveis ​​de ambiente não devem estar em maiúsculas.
19411 Chris Down
0

Existe a maneira simples

echo "startstr$(cat filename)endstring" > filename.new
Hogan
fonte
Isso quebrará com as novas linhas à direita.
Chris Down
@ChrisDown seguindo novas linhas no arquivo?
Hogan