Necesito agregar etiquetas PHP que rodean un archivo. Es fácil agregarlos usando
find . -exec echo "?>" >> '{}' \;
pero, ¿cómo puedo anteponer la etiqueta <?php?
Necesito agregar etiquetas PHP que rodean un archivo. Es fácil agregarlos usando
find . -exec echo "?>" >> '{}' \;
pero, ¿cómo puedo anteponer la etiqueta <?php?
Respuestas:
sed -i "1s/^/<?php /" file
(El -ies para editar en el lugar).
Versión más portátil:
ed file <<!
1s/^/<?php /
wq
!
sed, y permite agregar un sufijo de respaldo.
-ino es portátil, la sintaxis difiere entre implementaciones y rompe enlaces simbólicos. Sería mejor usar una aplicación que esté diseñada para editar archivos.
Todavía no puedo dejar un comentario, pero hacerlo todo en un solo paso:
find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;
Puedes hacer eso con un perl one-liner:
perl -0777 -p -i -e "s/^/hey /g" testfile
Las -0777fuerzas de archivos sorber modo, por lo que todo el archivo se leen como una sola línea. -ppermite el bucle. -ipermite la edición en el lugar del archivo. ^indica el comienzo de una línea.
$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf
Actualización: como se indica en los comentarios, puede optar por generar automáticamente una copia de seguridad utilizando en -i.baklugar de -i. Esto proporciona seguridad adicional en caso de errores en su comando. El argumento a se -i convierte en el sufijo de la copia de seguridad.
Al actualizar un montón de archivos, puede ejecutar el comando con -i.backup${RANDOM}, verificar que todos los archivos se hayan actualizado correctamente y luego eliminar todos los archivos con esa extensión.
-ibandera sin sufijo, advierta a los lectores que esto significa que no obtendrá copia de seguridad . Para algunos caracteres más ( -i.bak), obtendrá una copia de seguridad en caso de que su línea única incluya un error tipográfico. Un error tipográfico bastante simple (digamos, olvidando la -pbandera) puede arruinar su día entero de lo contrario.
sedes para editar transmisiones: un archivo no es una transmisión. Utilice un programa destinado a este fin, como edo ex. La -iopción sedno solo no es portátil, sino que también romperá cualquier enlace simbólico que pueda encontrar, ya que esencialmente lo elimina y lo recrea, lo cual no tiene sentido.
for file in foo bar baz; do
ed -s "${file}" << EOF
0a
<?php
.
w
EOF
done
edpara ese propósito, muéstrelo en su respuesta.
Una alternativa a lo que escribió para agregar algo al final de cada archivo en el directorio (en bash):
for FNAME in *
do
echo "?>" >> $FNAME
done
aunque me gusta tu findone-liner :)
$FNAMEdebería ser $fname: por convención, capitalizamos las variables de entorno (PAGER, EDITOR, SHELL, ...) y las variables internas de shell (BASH_VERSION, RANDOM, ...). Todos los demás nombres de variables deben contener al menos una letra minúscula. Esta convención evita anular accidentalmente variables ambientales e internas.
Hay una manera simple
echo "startstr$(cat filename)endstring" > filename.new