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 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
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
NR
variable: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 g
pour 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 file
xargs
et printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
Utilisation join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
Outils de Shell en 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 sûr, sponge
peut être remplacé par un fichier temporaire, ensuite mv
par-dessus le nom de fichier d'origine, comme avec d'autres réponses ...
sed
, à moins que les ressources ne soient très limitées.
sed
n'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 cat
lecture depuis stdin au lieu d'un fichier ne fait aucune différence pour cela).
touch
le fichier temporaire? Et je rendrais lased
commande conditionnelle au succès ducp
ou l'original pourrait être perdu.