Respuestas:
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.
sed -i
No es POSIX. Es GNU. FreeBSD sed
tiene una opción similar, pero la necesitas sed -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
:|paste -d'foo ' - - - - input > output
(es broma, aunque probablemente encontrará que es la más rápida de todas las soluciones publicadas aquí: -b).
La forma canónica es:
sed 's/^/foo /' < input > output
Sin embargo, no se adapta fácilmente a cadenas arbitrarias. Por ejemplo,
sed "s/^/$var /"
Sólo funciona si $var
no contiene, &
, \
, /
ni los caracteres de nueva línea.
En ese sentido,
export var
awk '{print ENVIRON["var"], $0}'
o
perl -pe '$_="$ENV{var} $_"'
Funcionaría mejor.
awk
Presento una solución usando la secuencia anterior "foo".
awk '{ print "foo", $0; }' input > output
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 la sed
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.
{ rm file; awk '{ print "foo", $0 }' > file; } < file
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!
ex sample.txt -c "%s/^/foo /" -c wq
Existe una ventaja adicional de que los comandos son fáciles y obvios para cualquiera que esté versado en el único editor verdadero.
Puedes usar perl
para hacer esto:
$ perl -pi -e 's/^/mystring /' afile.txt
Crea un archivo de muestra.
$ seq 5 > afile.txt
$ cat afile.txt
1
2
3
4
5
Ejecute el comando anterior:
$ perl -pi -e 's/^/mystring /' afile.txt
$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5
sed
, le mostré cómo usar Perl ... sin buscar una guerra santa sobre el asunto.
Simplemente usando Bash
while IFS= read -r line; do echo "foo" "${line}" ; done < input > Output
Usando Python
python -c "import sys; print 'foo '.join([ l for l in sys.stdin.readlines() ])" < input > Output
Si desea editar en el lugar
import fileinput
import sys
for line in fileinput.input(['inputfile'], inplace=True):
sys.stdout.write('foo {l}'.format(l=line))
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:
vi filename.txt
Esc(para asegurarte de que estás en NORMAL
modo) y luego ingresa el siguiente comando:
:1,$ s/^/mystring
1,$
simplemente %
. Esto hace el comando :%s/^/string/
.
-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.