Как я могу добавить имя файла в конец каждой строки в этом файле? - PullRequest
0 голосов
/ 21 ноября 2008

Мне нужно сделать следующее для сотен файлов: Добавьте имя файла (которое может содержать пробелы) в конец каждой строки в файле.

Мне кажется, должен быть какой-то способ сделать это:

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

где FILENAME представляет имя текущего файла. Существует ли переменная sed, представляющая текущее имя файла? Или у кого-нибудь есть другое решение, использующее bash, awk и т. Д .?

Ответы [ 7 ]

8 голосов
/ 21 ноября 2008

Я уверен, что есть другие способы сделать это, я бы использовал perl:

perl -p -i -e 's/$/$ARGV/;' *
4 голосов
/ 21 ноября 2008

Некоторые версии sed поддерживают аргумент "--in-place", поэтому вы можете сжать решение Тайлера до

for i in * ; do 
  sed -e "s/\$/$i/" --in-place "$i" 
done
4 голосов
/ 21 ноября 2008

Вы можете сделать это с помощью 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
2 голосов
/ 21 ноября 2008
awk '{print $0,FILENAME}' > tmpfile
0 голосов
/ 18 марта 2012

Это может работать для вас:

printf "%s\n" * | sed 's/.*/sed -i "s|$| &|" &/' | bash
0 голосов
/ 21 ноября 2008

Более или менее так, как предложил Тайлер, только с некоторыми изменениями, чтобы учесть пробелы в имени. Хотя я надеялся на однострочник ...

(
  OLDIFS=$IFS
  IFS=$'\n'
  for f in *
  do
    IFS=OLDIFS
    sed -e "s/\$/$f/" $f > tmpfile
    mv tmpfile $f
    IFS=$'\n'
  done
)
0 голосов
/ 21 ноября 2008

В BASH я бы сделал что-то с эффектом:

for f in *; do echo $f >> $f; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...