Come posso aggiungere il nome di un file alla fine di ogni riga in quel file?
Domanda
Devo fare quanto segue per centinaia di file: Aggiungi il nome del file (che può contenere spazi) alla fine di ogni riga nel file.
Mi sembra che ci dovrebbe essere un modo per farlo:
sed -e 's/$/FILENAME/' *
dove FILENAME
rappresenta il nome del file corrente. Esiste una variabile sed che rappresenta il nome file corrente? O qualcuno ha una soluzione diversa usando bash, awk, ecc.?
Soluzione
Sono sicuro che ci sono altri modi per farlo, userei perl:
perl -p -i -e 's/$/$ARGV/;' *
Altri suggerimenti
Alcune versioni di sed supportano " - sul posto " argomento in modo da poter condensare la soluzione di Tyler in
for i in * ; do
sed -e "s/\$/$i/" --in-place "$i"
done
Potresti farlo con uno script bash
for i in *
do
sed -e "s/\$/$i/" "$i"
done
Versione one-liner:
for i in * ; do sed -e "s/\$/$i/" "$i" ; done
Modifica: se si desidera sostituire il contenuto del file con le nuove righe aggiunte al nome, procedere come segue:
TFILE=`mktemp`
for i in *
do
sed -e "s/\$/$i/" "$i" > $TFILE
cp -f $TFILE "$i"
done
rm -f $TFILE
awk '{print <*>,FILENAME}' > tmpfile
In BASH, farei qualcosa per l'effetto di:
for f in *; do echo $f >> $f; done
Più o meno come ha suggerito Tyler, solo con alcune modifiche per consentire gli spazi nel nome. Speravo in un one-liner però ...
(
OLDIFS=$IFS
IFS=\n'
for f in *
do
IFS=OLDIFS
sed -e "s/\$/$f/" $f > tmpfile
mv tmpfile $f
IFS=\n'
done
)
Questo potrebbe funzionare per te:
printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash