0

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

在我看来应该有一些方法可以做到这一点:

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

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

4

7 回答 7

8

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

perl -p -i -e 's/$/$ARGV/;' *
于 2008-11-21T18:04:11.770 回答
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
于 2008-11-21T17:53:37.330 回答
4

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

for i in * ; do 
  sed -e "s/\$/$i/" --in-place "$i" 
done
于 2008-11-21T18:01:02.947 回答
2
awk '{print $0,FILENAME}' > tmpfile
于 2008-11-21T18:11:51.910 回答
0

在 BASH 中,我会做一些事情:

for f in *; do echo $f >> $f; done
于 2008-11-21T17:54:49.450 回答
0

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

(
  OLDIFS=$IFS
  IFS=$'\n'
  for f in *
  do
    IFS=OLDIFS
    sed -e "s/\$/$f/" $f > tmpfile
    mv tmpfile $f
    IFS=$'\n'
  done
)
于 2008-11-21T18:09:24.553 回答
0

这可能对您有用:

printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash
于 2012-03-18T17:24:13.230 回答