web-dev-qa-db-fra.com

Comment ajouter une chaîne au début de chaque ligne d'un fichier?

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
17
bobbyrne01

une commande awk sur une ligne devrait faire l'affaire aussi:

awk '{print "prefix" $0}' file
37
nullrevolution

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

13
Nick Petersen

La boucle entière peut être remplacée par une seule commande sed qui agit sur tout le fichier:

sed -e 's/^/prefix/' $file
8
Jack

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.

3
Andy Lester

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
3
William Pursell

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`; ...
0
glenn jackman

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
0
Ahmad Awais