Comment ajouter une chaîne après chaque ligne dans un fichier en utilisant bash? Cela peut-il être fait en utilisant la commande sed, si oui, comment?
Comment ajouter une chaîne après chaque ligne dans un fichier en utilisant bash? Cela peut-il être fait en utilisant la commande sed, si oui, comment?
Réponses:
Si votre sedpermet l'édition en place via le -iparamè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
sed -e 's/^/string after each line/' -i filename $ signifie fin de ligne. ^ signifie début de ligne.
sed 's/^/string after each line/'fait ce à quoi je m'attendais (préfixe chaque ligne) mais sed 's/^/string after each line/'ne le fait pas (il remplace la ligne entière par ma chaîne d'ajout). Ce qui donne? Des idées @TomDeGisi?
Je préfère utiliser awk. S'il n'y a qu'une seule colonne, utilisez$0 , sinon remplacez-la 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
NRvariable:awk '{print $0, NR}'
sed 's/ //g'cela a fonctionné pour mes besoins, mais cela supprimera de l'espace dans chaque ligne, c'est quelle option gpour et partout dans une ligne.
, comme {print $0"string to append after each line"}.
Si vous l'avez, l' utilitaire lam (stratifié) peut le faire, par exemple:
$ lam filename -s "string after each line"
Shell POSIX pur et sponge:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge filexargset printf:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge fileUtilisation join:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge fileOutils de Shell en utilisant paste, yes, head
& wc:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Notez que pasteinsère un caractère Tab avant $suffix.
Bien sûr, spongepeut être remplacé par un fichier temporaire, ensuite mvpar-dessus le nom de fichier d'origine, comme avec d'autres réponses ...
sed, à moins que les ressources ne soient très limitées.
sedn'est pas nécessaire pour un travail aussi simple.
Je préfère echo. en utilisant pure bash:
cat file | while read line; do echo ${line}$string; done
Sed est un peu moche, vous pourriez le faire élégamment comme ceci:
hendry@i7 tmp$ cat foo
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar
cat foo; faire echo $ {i} bar; fait foobar barbar bazbar mais après quelques tests, je me trompe peut-être sur mon raisonnement, mais Dennis a raison
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)qui imprime 2 lignes même si l'entrée est 1 ligne foo bar(et la catlecture depuis stdin au lieu d'un fichier ne fait aucune différence pour cela).
touchle fichier temporaire? Et je rendrais lasedcommande conditionnelle au succès ducpou l'original pourrait être perdu.