web-dev-qa-db-fra.com

Dans Bash, comment puis-je ajouter une chaîne après chaque ligne d'un fichier?

Comment ajouter une chaîne après chaque ligne d'un fichier à l'aide de bash? Peut-on le faire en utilisant la commande sed, si oui comment?

100
Jason Volkoz

Si votre sed permet l'édition en place via le -i paramètre:

sed -e 's/$/string after each line/' -i filename

Sinon, vous devez créer un fichier temporaire:

typeset TMP_FILE=$( mktemp )

touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename
162
Tom DeGisi

Je préfère utiliser awk. S'il n'y a qu'une seule colonne, utilisez $0, sinon remplacez-le par la dernière colonne.

Une manière,

awk '{print $0, "string to append after each line"}' file > new_file

ou ca,

awk '$0=$0"string to append after each line"' file > new_file
11
Optimus Prime

Si vous en avez, l'utilitaire lam (stratifié) peut le faire, par exemple:

$ lam filename -s "string after each line"
7
martin clayton
  1. Pure POSIX Shell et sponge :

    suffix=foobar
    while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file | 
    sponge file
    
  2. xargs et printf:

    suffix=foobar
    xargs -L 1 printf "%s${suffix}\n" < file | sponge file
    
  3. Utiliser join:

    suffix=foobar
    join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
    
  4. Outils shell utilisant paste, yes, head & wc:

    suffix=foobar
    paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
    

    Notez que paste insère un caractère Tab avant $suffix.

Bien entendu, sponge peut être remplacé par un fichier temporaire, puis mv 'd sur le nom de fichier d'origine, comme pour d'autres réponses ...

3
agc