¿Cómo puedo agregar el nombre de un archivo al final de cada línea en ese archivo?
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.?
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