Как я могу добавить имя файла в конец каждой строки в этом файле?
Вопрос
Мне нужно сделать следующее для сотен файлов: Добавьте имя файла (которое может содержать пробелы) в конец каждой строки в файле.
Мне кажется, должен быть какой-то способ сделать это:
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 <*>,FILENAME}' > tmpfile
В BASH я бы сделал что-то с эффектом:
for f in *; do echo $f >> $f; done
Более или менее так, как предложил Тайлер, только с некоторыми изменениями, чтобы учесть пробелы в имени. Я надеялся на однострочник, хотя ...
(
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