¿Cuál es la forma más sencilla de agregar una cadena al comienzo de cada línea del archivo desde la línea de comando?

¿Cuál es la forma más sencilla de agregar una cadena al comienzo de cada línea del archivo desde la línea de comando?

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 $varno 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 -iopció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 -icambio 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).

seddebería estar disponible en cualquier sistema operativo compatible con POSIX y perldeberí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 awkanteponiendo la cadena "foo".

awk '{ print "foo", $0; }' input > output

awkes 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 perlpara 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

información relacionada