Como posso acrescentar o nome de um arquivo para final de cada linha nesse arquivo?

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

  •  08-07-2019
  •  | 
  •  

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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top