简体   繁体   中英

How can I append the name of a file to end of each line in that file?

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

我确定还有其他方法可以使用perl:

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

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

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
awk '{print $0,FILENAME}' > tmpfile

在BASH中,我会采取以下措施:

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
)

这可能对您有用:

printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM