un comando awk de una línea también debería funcionar:
awk '{print "prefix" $0}' file
El bucle completo se puede reemplazar con un solo comando sed que opera en todo el archivo:
sed -e 's/^/prefix/' $file
Con respecto a su error original:
./appendToFile.sh:línea 11:/bin/sed:Lista de argumentos demasiado larga
El problema está en esta línea de código:
sed -e 's/^/prefix/' $line
$line
en este contexto es nombre de archivo que sed corre en contra. Para corregir su código, debe arreglar esta línea como tal:
echo $line | sed -e 's/^/prefix/'
(También tenga en cuenta que su código original no debe tener el < $file
al final.)
William Pursell aborda este problema correctamente en sus dos sugerencias.
Sin embargo, creo que ha identificado correctamente que hay un problema con su archivo de texto original. dos2unix
no corregirá este problema, ya que solo elimina los retornos de carro de Windows al final de las líneas. (Sin embargo, si está intentando leer un archivo de Linux en Windows, obtendrá una línea gigantesca sin retornos).
Asumiendo que no es un problema con los caracteres de fin de línea en su archivo de texto, las respuestas de William Pursell, Andy Lester o nullrevolution funcionarán.
Una variación del while read...
sugerencia:
while read -r line; do echo "PREFIX " $line; done < $file
Esto podría ejecutarse directamente desde el shell (no es necesario un archivo de script/lote):
while read -r line; do echo "kp" $line; done < stusers.txt
Una forma Perl de hacerlo sería:
perl -p -e's/^/prefix' filename
o
perl -p -e'$_ = "prefix $_"' filename
En cualquier caso, eso se lee desde filename
e imprime las líneas prefijadas en STDOUT.
Si agrega un -i
entonces Perl modificará el archivo en su lugar. También puede especificar varios nombres de archivo y Perl los hará todos mágicamente.