une commande awk d'une ligne devrait également faire l'affaire :
awk '{print "prefix" $0}' file
La boucle entière peut être remplacée par une seule commande sed qui agit sur l'ensemble du fichier :
sed -e 's/^/prefix/' $file
Concernant votre erreur d'origine :
./appendToFile.sh :ligne 11 :/bin/sed :liste d'arguments trop longue
Le problème vient de cette ligne de code :
sed -e 's/^/prefix/' $line
$line
dans ce contexte est nom de fichier qui sed est en cours d'exécution contre. Pour corriger votre code, vous devez corriger cette ligne comme telle :
echo $line | sed -e 's/^/prefix/'
(Notez également que votre code d'origine ne doit pas contenir le < $file
à la fin.)
William Pursell aborde correctement ce problème dans ses deux suggestions.
Cependant, je crois que vous avez correctement identifié qu'il y a un problème avec votre fichier texte d'origine. dos2unix
ne corrigera pas ce problème, car il ne fait que supprimer les retours chariot de Windows à la fin des lignes. (Cependant, si vous essayez de lire un fichier Linux sous Windows, vous obtiendrez une ligne gigantesque sans retour.)
En supposant que ce n'est pas un problème avec les caractères de fin de ligne dans votre fichier texte, les réponses de William Pursell, Andy Lester ou nullrevolution fonctionneront.
Une variante du while read...
proposition :
while read -r line; do echo "PREFIX " $line; done < $file
Cela pourrait être exécuté directement à partir du shell (pas besoin d'un fichier batch / script):
while read -r line; do echo "kp" $line; done < stusers.txt
Une façon Perl de le faire serait :
perl -p -e's/^/prefix' filename
ou
perl -p -e'$_ = "prefix $_"' filename
Dans les deux cas, cela lit à partir de filename
et imprime les lignes préfixées sur STDOUT.
Si vous ajoutez un -i
flag, alors Perl modifiera le fichier en place. Vous pouvez également spécifier plusieurs noms de fichiers et Perl les fera tous comme par magie.