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
?
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
?
Respostas:
sed -i "1s/^/<?php /" file
( -i
É para edição no local.)
Versão mais portátil:
ed file <<!
1s/^/<?php /
wq
!
sed
, e permite adicionar um sufixo de backup.
-i
nã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.
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/\$/ ?>/" {} \;
Você pode fazer isso com um one-liner perl:
perl -0777 -p -i -e "s/^/hey /g" testfile
As -0777
forças modo de sorver arquivo, então o arquivo inteiro é lido como uma linha. -p
ativa o loop. -i
permite 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.bak
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 -i.backup${RANDOM}
, verificar se todos os arquivos foram atualizados corretamente e remover todos os arquivos com essa extensão.
-i
bandeira 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 -p
bandeira) pode arruinar o dia inteiro.
sed
é para editar fluxos - um arquivo não é um fluxo. Use um programa destinado a esse fim, como ed
ou ex
. A -i
opção sed
nã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
ed
para esse fim, mostre isso na sua resposta.
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 find
one-liner :)
$FNAME
deve 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.
Existe a maneira simples
echo "startstr$(cat filename)endstring" > filename.new