Wie kann ich anhängen der Name einer Datei in der Datei jeder Zeile zu beenden?
Frage
Ich brauche die folgenden für Hunderte von Dateien zu tun: Fügen Sie den Namen der Datei an das Ende jeder Zeile in der Datei (die Leerzeichen enthalten kann).
Es scheint mir, es sollte eine gewisse Art und Weise, dies zu tun:
sed -e 's/$/FILENAME/' *
Dabei gilt FILENAME
steht für den Namen der aktuellen Datei. Gibt es eine Sed Variable den aktuellen Dateinamen darstellen? Oder hat jemand eine andere Lösung haben bash verwenden, awk, etc.?
Lösung
Ich bin sicher, dass es andere Möglichkeiten gibt, es zu tun, würde ich Perl verwenden:
perl -p -i -e 's/$/$ARGV/;' *
Andere Tipps
Einige Versionen von sed Unterstützung der "--in-place" Argument so können Sie Tylers Lösung
kondensierenfor i in * ; do
sed -e "s/\$/$i/" --in-place "$i"
done
Man könnte es mit einem Bash-Skript tun
for i in *
do
sed -e "s/\$/$i/" "$i"
done
Einzeiler Version:
for i in * ; do sed -e "s/\$/$i/" "$i" ; done
Edit: Wenn Sie auf ersetzen der Inhalt der Datei mit den neuen, Namen mit angebundenem Linien, dies zu tun:
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
In BASH, ich etwas auf die Wirkung tun würde:
for f in *; do echo $f >> $f; done
Mehr oder weniger wie Tyler vorgeschlagen, nur mit einigen Modifikationen für Leerzeichen im Namen zu ermöglichen. Ich hatte gehofft, für einen Einzeiler obwohl ...
(
OLDIFS=$IFS
IFS=$'\n'
for f in *
do
IFS=OLDIFS
sed -e "s/\$/$f/" $f > tmpfile
mv tmpfile $f
IFS=$'\n'
done
)
Dies könnte für Sie arbeiten:
printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash