Como posso acrescentar o nome de um arquivo para final de cada linha nesse arquivo?
Pergunta
Eu preciso fazer o seguinte para centenas de arquivos: Acrescentar o nome do arquivo (que pode conter espaços) ao final de cada linha no arquivo.
Parece-me que deve haver alguma maneira de fazer isso:
sed -e 's/$/FILENAME/' *
onde FILENAME
representa o nome do arquivo atual. Existe uma variável sed que representa o nome do arquivo atual? Ou alguém tem uma solução diferente usando bash, awk, etc.?
Solução
Estou certo de que há outras maneiras de fazer isso, eu uso perl:
perl -p -i -e 's/$/$ARGV/;' *
Outras dicas
Algumas versões do apoio sed o argumento "--in-lugar" para que possa condensar solução de Tyler para
for i in * ; do
sed -e "s/\$/$i/" --in-place "$i"
done
Você poderia fazer isso com um script bash
for i in *
do
sed -e "s/\$/$i/" "$i"
done
versão One-liner:
for i in * ; do sed -e "s/\$/$i/" "$i" ; done
Editar: Se você quiser substituir o conteúdo do arquivo com as novas linhas, anexado com nome comercial, faça o seguinte:
TFILE=`mktemp`
for i in *
do
sed -e "s/\$/$i/" "$i" > $TFILE
cp -f $TFILE "$i"
done
rm -f $TFILE
awk '{print $0,FILENAME}' > tmpfile
No bash, eu faria algo no sentido de:
for f in *; do echo $f >> $f; done
Mais ou menos como Tyler sugeriu, apenas com algumas modificações para permitir espaços no nome. Eu estava esperando por um one-liner embora ...
(
OLDIFS=$IFS
IFS=$'\n'
for f in *
do
IFS=OLDIFS
sed -e "s/\$/$f/" $f > tmpfile
mv tmpfile $f
IFS=$'\n'
done
)
Este trabalho poder para você:
printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash