题
我需要为数百个文件执行以下操作: 将文件名(可能包含空格)附加到文件中每行的末尾。
在我看来应该有办法做到这一点:
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
不隶属于 StackOverflow