J'ai le code bash suivant qui parcourt un fichier texte, ligne par ligne .. im essayant de préfixer le préfixe de travail à chaque ligne mais recevant plutôt cette erreur:
rob@laptop:~/Desktop$ ./appendToFile.sh stusers.txt kp
stusers.txt
kp
./appendToFile.sh: line 11: /bin/sed: Argument list too long
[email protected],passw0rd
Ceci est le script bash ..
#!/bin/bash
file=$1
string=$2
echo "$file"
echo "$string"
for line in `cat $file`
do
sed -e 's/^/prefix/' $line
echo "$line"
done < $file
Qu'est-ce que je fais mal ici?
Mise à jour: Effectuer la tête sur fichier dump toutes les lignes sur une seule ligne du terminal, probablement liée?
rob@laptop:~/Desktop$ head stusers.txt
rob@laptop:~/Desktop$ ouse.com,passw0rd
une commande awk sur une ligne devrait faire l'affaire aussi:
awk '{print "prefix" $0}' file
Concernant votre erreur d'origine:
./appendToFile.sh: ligne 11:/bin/sed: liste d'arguments trop longue
Le problème est avec cette ligne de code:
sed -e 's/^/prefix/' $line
$ line dans ce contexte est nom du fichier contre lequel sed est exécuté. Pour corriger votre code, vous devez corriger cette ligne en tant que tel:
echo $line | sed -e 's/^/prefex/'
(Notez également que votre code d'origine ne devrait pas avoir le < $file
à la fin.)
William Pursell aborde cette question correctement dans ses deux suggestions.
Cependant, je pense que vous avez correctement identifié le problème avec votre fichier texte original. dos2unix
ne corrigera pas ce problème, car il ne traite que les bâtons renvoyés par des clés Windows à la fin des lignes. (Cependant, si vous essayez de lire un fichier Linux dans Windows, vous obtiendrez une ligne gigantesque sans retour.)
En supposant qu'il ne s'agisse pas d'un problème de fin de ligne dans votre fichier texte, les réponses de William Pursell, d'Andy Lester ou de nullrevolution fonctionneront.
Une variante de la suggestion while read...
:
while read -r line; do echo "PREFIX " $line; done < $file
Cela pourrait être exécuté directement à partir du shell (pas besoin de fichier batch/script):
while read -r line; do echo "kp" $line; done < stusers.txt
La boucle entière peut être remplacée par une seule commande sed qui agit sur tout le fichier:
sed -e 's/^/prefix/' $file
Une façon de faire Perl serait:
Perl -p -e's/^/prefix' filename
ou
Perl -p -e'$_ = "prefix $_"' filename
Dans les deux cas, cela lit à partir de filename
et affiche les lignes préfixées dans STDOUT.
Si vous ajoutez un drapeau -i
, Perl modifiera le fichier en place. Vous pouvez également spécifier plusieurs noms de fichiers et Perl les fera tous comme par magie.
Au lieu de la boucle for, il est plus approprié d'utiliser while read...
:
while read -r line; do
do
echo "$line" | sed -e 's/^/prefix/'
done < $file
Mais vous seriez beaucoup mieux avec le plus simple:
sed -e 's/^/prefix/' $file
Vous n'avez pas besoin de sed, concaténez simplement les chaînes dans la commande echo
while IFS= read -r line; do
echo "prefix$line"
done < filename
Votre boucle parcourt chaque Word dans le fichier:
for line in `cat file`; ...
Utilisez sed. Il suffit de changer le mot prefix
.
sed -e 's/^/prefix/' file.ext
Si vous souhaitez enregistrer la sortie dans un autre fichier
sed -e 's/^/prefix/' file.ext > file_new.ext