Comment puis-je ajouter le nom d'un fichier à la fin de chaque ligne de ce fichier?

StackOverflow https://stackoverflow.com/questions/309604

  •  08-07-2019
  •  | 
  •  

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/' *

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.?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top