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?
112
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
touch
le fichier temporaire? Et je rendrais lased
commande conditionnelle au succès ducp
ou l'original pourrait être perdu.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) maissed '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,
ou ca,
la source
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 optiong
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:
la source
Shell POSIX pur et
sponge
:xargs
etprintf
:Utilisation
join
:Outils de Shell en utilisant
paste
,yes
,head
&wc
:Notez que
paste
insère un caractère Tab avant$suffix
.Bien sûr,
sponge
peut être remplacé par un fichier temporaire, ensuitemv
par-dessus le nom de fichier d'origine, comme avec d'autres réponses ...la source
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:la source
Sed est un peu moche, vous pourriez le faire élégamment comme ceci:
la source
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 raisonecho "foo bar" | (for i in `cat`; do echo ${i}bar; done)
qui imprime 2 lignes même si l'entrée est 1 lignefoo bar
(et lacat
lecture depuis stdin au lieu d'un fichier ne fait aucune différence pour cela).