Question

I need to do the following for hundreds of files: Append the name of the file (which may contain spaces) to the end of each line in the file.

It seems to me there should be some way to do this:

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

where FILENAME represents the name of the current file. Is there a sed variable representing the current filename? Or does anyone have a different solution using bash, awk, etc.?

Was it helpful?

Solution

I'm sure there are other ways to do it, I'd use perl:

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

OTHER TIPS

Some versions of sed support the "--in-place" argument so you can condense Tyler's solution to

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

You could do it with a bash script

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

One-liner version:

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

Edit: If you want to replace the contents of the file with the new, name-appended lines, do this:

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

In BASH, I'd do something to the effect of:

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

More or less how Tyler suggested, just with some modifications to allow for spaces in the name. I was hoping for a one-liner though...

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

This might work for you:

printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top