Puedes usar sed
:
sed -i 's/^/your_string /' your_file
Gracias a los comentarios de Stephane y Marco, tenga en cuenta que la -i
opción no es POSIX. Una forma POSIX de hacer lo anterior sería
sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file
o perl
:
perl -pi -e 's/^/your_string /' your_file
Explicación
Ambos comandos realizan una sustitución de expresiones regulares, reemplazando el comienzo de una línea ( ^
) con la cadena deseada. El -i
interruptor en ambos comandos asegura que el archivo se edite en su lugar (es decir, los cambios se reflejan en el archivo en lugar de imprimirse en stdout).
sed
debería estar disponible en cualquier sistema operativo compatible con POSIX y perl
debería estar disponible en la mayoría de los Unices modernos, excepto quizás en aquellos que se han esforzado por eliminarlo.
-i
interruptor no edita el archivo en su lugar. Crea un nuevo archivo y sobrescribe el original una vez hecho (prueba: el inodo cambia). No hay muchas herramientas que realmente realicen la edición in situ, lo cual es una operación peligrosa. Además, dado que menciona POSIX, el-i
cambio no es obligatorio para un POSIX compatiblesed
, es una característica de algunas implementaciones particulares.sed -i
No es POSIX. Es GNU. FreeBSDsed
tiene una opción similar, pero la necesitassed -i ''
allí.-i
crea una copia temporal (por eso dije que los cambios se reflejan en el archivo original); Quise decir que obtienes la misma semántica que la sustitución in situ. Verifique que la respuesta actualizada sea compatible con POSIX.$$
(la identificación de proceso del shell actual) como parte de un nombre de archivo temporal; evita el esfuerzo de pensar en un nombre único garantizado cada vez:command filename > filename.$$ && mv filename.$$ filename
(es broma, aunque probablemente encontrará que es la más rápida de todas las soluciones publicadas aquí: -b).
La forma canónica es:
Sin embargo, no se adapta fácilmente a cadenas arbitrarias. Por ejemplo,
Sólo funciona si
$var
no contiene,&
,\
,/
ni los caracteres de nueva línea.En ese sentido,
o
Funcionaría mejor.
fuente
awk
Presento una solución usando la secuencia anterior "foo".awk
es multiplataforma y está disponible en cualquier sistema POSIX. No hace edición en el lugar. Si desea editar un archivo sin crear uno segundo, deberá usar un archivo temporal. Vea lased
respuesta de Joseph , muestra la sintaxis. Otro truco es usar la siguiente sintaxis, que básicamente es crear un archivo temporal con el mismo nombre de archivo que el archivo original.fuente
reducto# wc -l foo
`914 foo`reducto# { rm foo ; awk '{ print "prepend" , $0 }' > foo } < foo
>
Esto no parece funcionar. Lo intentaba porque la redirección al original me ponía nervioso, pero ni siquiera comienza.Puede evitar los problemas de la edición in situ con las herramientas de transmisión utilizando una herramienta que normalmente realiza la edición in situ: ¡un editor!
Existe una ventaja adicional de que los comandos son fáciles y obvios para cualquiera que esté versado en el único editor verdadero.
fuente
Puedes usar
perl
para hacer esto:Ejemplo
Crea un archivo de muestra.
Ejecute el comando anterior:
fuente
sed
, le mostré cómo usar Perl ... sin buscar una guerra santa sobre el asunto.Simplemente usando Bash
Usando Python
Si desea editar en el lugar
Link de referencia
fuente
awk
en archivos muy pequeños. El comportamiento varía entre las implementaciones de eco y elimina espacios en blanco iniciales y finales, y procesa barras invertidas especialmente.prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }
Debería ser más correcto.{}
? Creo que @Matt estaba sugiriendo que lo convirtieras en una función con nombre, ¿qué sentido tiene{}
sin un nombre de función?O puede hacer lo siguiente:
Esc(para asegurarte de que estás en
NORMAL
modo) y luego ingresa el siguiente comando:fuente
1,$
simplemente%
. Esto hace el comando:%s/^/string/
.