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.?

War es hilfreich?

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

kondensieren
for 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top