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

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

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

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

有帮助吗?

解决方案

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

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

其他提示

某些版本的sed支持<!>“; - 就地<!>”;参数,所以你可以将泰勒的解决方案浓缩为

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

您可以使用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
awk '{print $0,FILENAME}' > tmpfile

在BASH,我会做一些事情:

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

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

(
  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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top