Domanda

Devo fare quanto segue per centinaia di file: Aggiungi il nome del file (che può contenere spazi) alla fine di ogni riga nel file.

Mi sembra che ci dovrebbe essere un modo per farlo:

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

dove FILENAME rappresenta il nome del file corrente. Esiste una variabile sed che rappresenta il nome file corrente? O qualcuno ha una soluzione diversa usando bash, awk, ecc.?

È stato utile?

Soluzione

Sono sicuro che ci sono altri modi per farlo, userei perl:

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

Altri suggerimenti

Alcune versioni di sed supportano " - sul posto " argomento in modo da poter condensare la soluzione di Tyler in

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

Potresti farlo con uno script bash

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

Versione one-liner:

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

Modifica: se si desidera sostituire il contenuto del file con le nuove righe aggiunte al nome, procedere come segue:

TFILE=`mktemp`
for i in * 
do
  sed -e "s/\$/$i/" "$i" > $TFILE
  cp -f $TFILE "$i"
done
rm -f $TFILE
awk '{print <*>,FILENAME}' > tmpfile

In BASH, farei qualcosa per l'effetto di:

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

Più o meno come ha suggerito Tyler, solo con alcune modifiche per consentire gli spazi nel nome. Speravo in un one-liner però ...

(
  OLDIFS=$IFS
  IFS=\n'
  for f in *
  do
    IFS=OLDIFS
    sed -e "s/\$/$f/" $f > tmpfile
    mv tmpfile $f
    IFS=\n'
  done
)

Questo potrebbe funzionare per te:

printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top