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 -i
es para editar en el lugar).
Versión más portátil:
ed file <<!
1s/^/<?php /
wq
!
sed
, y permite agregar un sufijo de respaldo.
-i
no 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 -0777
fuerzas de archivos sorber modo, por lo que todo el archivo se leen como una sola línea. -p
permite el bucle. -i
permite 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.bak
lugar 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.
-i
bandera 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 -p
bandera) puede arruinar su día entero de lo contrario.
sed
es para editar transmisiones: un archivo no es una transmisión. Utilice un programa destinado a este fin, como ed
o ex
. La -i
opción sed
no 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
ed
para 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 find
one-liner :)
$FNAME
deberí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