¿Cómo puedo agregar el nombre de un archivo al final de cada línea en ese archivo?

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

  •  08-07-2019
  •  | 
  •  

Pregunta

Necesito hacer lo siguiente para cientos de archivos: Agregue el nombre del archivo (que puede contener espacios) al final de cada línea en el archivo.

Me parece que debería haber alguna forma de hacer esto:

sed -e 's/$/FILENAME/' *

donde FILENAME representa el nombre del archivo actual. ¿Hay una variable sed que represente el nombre de archivo actual? ¿O alguien tiene una solución diferente usando bash, awk, etc.?

¿Fue útil?

Solución

Estoy seguro de que hay otras formas de hacerlo, usaría perl:

perl -p -i -e 's/$/$ARGV/;' *

Otros consejos

Algunas versiones de sed son compatibles con " - in-place " argumento para que pueda condensar la solución de Tyler para

for i in * ; do 
  sed -e "s/\$/$i/" --in-place "$i" 
done

Podrías hacerlo con un script bash

for i in * 
do
  sed -e "s/\$/$i/" "$i" 
done

Versión de una línea:

for i in * ; do sed -e "s/\$/$i/" "$i" ; done

Editar: Si desea reemplazar el contenido del archivo con las nuevas líneas con nombre, haga esto:

TFILE=`mktemp`
for i in * 
do
  sed -e "s/\$/$i/" "$i" > $TFILE
  cp -f $TFILE "$i"
done
rm -f $TFILE
awk '{print <*>,FILENAME}' > tmpfile

En BASH, haría algo en el sentido de:

for f in *; do echo $f >> $f; done

Más o menos como sugirió Tyler, solo con algunas modificaciones para permitir espacios en el nombre. Sin embargo, esperaba una frase ...

(
  OLDIFS=$IFS
  IFS=\n'
  for f in *
  do
    IFS=OLDIFS
    sed -e "s/\$/$f/" $f > tmpfile
    mv tmpfile $f
    IFS=\n'
  done
)

Esto podría funcionar para usted:

printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top