Estoy buscando una manera de agregar una cadena al principio de cada línea (la misma cadena para cada línea). No es algo personalizable, sino algo que será fácil de recordar y estará disponible en todas las plataformas compatibles con POSIX (y también en todos los shells).
Respuesta1
:|paste -d'foo ' - - - - input > output
(Es broma, aunque probablemente descubras 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 /"
Solo funciona si $var
no contiene caracteres de nueva línea, &
ni caracteres de nueva línea, y es una vulnerabilidad de ejecución de comando arbitraria en GNU sed al menos si eso no se puede garantizar.\
/
En ese sentido,
export var
awk '{print ENVIRON["var"], $0}'
o
perl -pe '$_="$ENV{var} $_"'
funcionaría mejor.
Respuesta2
Puedes usar sed
:
sed -i 's/^/your_string /' your_file
Gracias a los comentarios de Stéphane 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
cambio en ambos comandos garantiza que el archivo se edite en su lugar (es decir, los cambios se reflejan en el archivo en lugar de imprimirse en la salida estándar).
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 aquellos quehan pasado por el esfuerzode eliminarlo.
Respuesta3
Presento una solución awk
anteponiendo la cadena "foo".
awk '{ print "foo", $0; }' input > output
awk
es multiplataforma y está disponible en cualquier sistema POSIX. No realiza edición in situ. Si desea editar un archivo sin crear uno segundo, deberá utilizar un archivo temporal. Vea la respuesta de Joseph sed
, muestra la sintaxis. Otro truco consiste en utilizar la siguiente sintaxis, que básicamente consiste en crear un archivo temporal con el mismo nombre que el archivo original.
{ rm file; awk '{ print "foo", $0 }' > file; } < file
Respuesta4
Puedes usar perl
para hacer esto:
$ perl -pi -e 's/^/mystring /' afile.txt
Ejemplo
Cree 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