如何将文件名附加到该文件中每行的末尾?

时间:2008-11-21 17:48:30

标签: perl bash sed awk

我需要为数百个文件执行以下操作: 将文件名(可能包含空格)附加到文件中每行的末尾。

在我看来应该有办法做到这一点:

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

其中FILENAME表示当前文件的名称。是否有表示当前文件名的sed变量?或者有人使用bash,awk等有不同的解决方案吗?

7 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

您可以使用bash脚本执行此操作

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

单线版:

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

修改:如果您想要使用新的,附加名称的行替换文件的内容,请执行以下操作:

TFILE=`mktemp`
for i in * 
do
  sed -e "s/\$/$i/" "$i" > $TFILE
  cp -f $TFILE "$i"
done
rm -f $TFILE

答案 2 :(得分:4)

某些版本的sed支持“--in-place”参数,因此您可以将Tyler的解决方案压缩为

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

答案 3 :(得分:2)

awk '{print $0,FILENAME}' > tmpfile

答案 4 :(得分:0)

在BASH,我会做一些事情:

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

答案 5 :(得分:0)

或多或少Tyler的建议,只是进行了一些修改以允许名称中的空格。我希望有一个单行...但

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

答案 6 :(得分:0)

这可能对您有用:

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