Comment puis-je ajouter le nom d'un fichier à la fin de chaque ligne de ce fichier?
Question
Je dois effectuer les opérations suivantes pour des centaines de fichiers: Ajoutez le nom du fichier (qui peut contenir des espaces) à la fin de chaque ligne du fichier.
Il me semble qu'il devrait y avoir un moyen de le faire:
sed -e 's/$/FILENAME/' *
où FILENAME
représente le nom du fichier actuel. Existe-t-il une variable sed représentant le nom de fichier actuel? Ou est-ce que quelqu'un a une solution différente en utilisant bash, awk, etc.?
La solution
Je suis sûr qu'il y a d'autres moyens de le faire, j'utiliserais perl:
perl -p -i -e 's/$/$ARGV/;' *
Autres conseils
Certaines versions de sed prennent en charge le " - in-place " argument afin que vous puissiez condenser la solution de Tyler à
for i in * ; do
sed -e "s/\$/$i/" --in-place "$i"
done
Vous pouvez le faire avec un script bash
for i in *
do
sed -e "s/\$/$i/" "$i"
done
Version monocouche:
for i in * ; do sed -e "s/\$/$i/" "$i" ; done
Modifier: si vous souhaitez remplacer le contenu du fichier par les nouvelles lignes ajoutées au nom, procédez comme suit:
TFILE=`mktemp`
for i in *
do
sed -e "s/\$/$i/" "$i" > $TFILE
cp -f $TFILE "$i"
done
rm -f $TFILE
awk '{print <*>,FILENAME}' > tmpfile
Sous BASH, je ferais quelque chose qui aurait pour effet:
for f in *; do echo $f >> $f; done
Plus ou moins ce que suggérait Tyler, avec juste quelques modifications pour permettre des espaces dans le nom. J'espérais un one-liner si ...
(
OLDIFS=$IFS
IFS=\n'
for f in *
do
IFS=OLDIFS
sed -e "s/\$/$f/" $f > tmpfile
mv tmpfile $f
IFS=\n'
done
)
Cela pourrait fonctionner pour vous:
printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash