我需要为数百个文件执行以下操作: 将文件名(可能包含空格)附加到文件中每行的末尾。
在我看来应该有办法做到这一点:
sed -e 's/$/FILENAME/' *
其中FILENAME
表示当前文件的名称。是否有表示当前文件名的sed变量?或者有人使用bash,awk等有不同的解决方案吗?
答案 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